egret-docs-master/Engine3D/Effect/RenderMethod/README.md

263 lines
8.7 KiB
Markdown
Raw Permalink Normal View History

2024-06-19 13:32:32 +08:00
* AlphaMaskMethod的使用
* 通过采样贴图中的red的数值r将这个r值作为最终输出像素颜色值的alpha相乘获得alpha通道的遮罩效果。
* 你可以继续追加一个uv滚动效果在这个alpha遮罩上面获得具有流动效果的alpha遮罩。
* 可以用于水流/天光等类型效果的模拟实现。
----------
class AlphaMaskMethod {
protected _material: egret3d.TextureMaterial;
protected onInit3D(): void {
this._material = new egret3d.TextureMaterial();
var maskmapMethod: egret3d.AlphaMaskMethod = new egret3d.AlphaMaskMethod();
this._material.diffusePass.addMethod(maskmapMethod);
maskmapMethod.maskTexture = egret3d.CheckerboardTexture.texture;
}
}
示例展示为贴图A叠加以贴图B为alphaMask后得到运行结果C
![](alphaMask.png)
----------
* AOMapMethod的使用
* 采样aoTexture中的rgb的数值将这个颜色值和最终输出像素颜色值的相乘。AO贴图为通过第三方渲染工具渲染出的素材。
* 主要用于模拟自然环境遮挡效果,增强真实感。
----------
class AOMapMethod {
protected _material: egret3d.TextureMaterial;
protected onInit3D(): void {
//注AOMapMethod使用到了另外一个uv数据该数据为第三方软件中预渲染好的。
this._material = new egret3d.TextureMaterial();
var maskmapMethod: egret3d.AOMapMethod = new egret3d.AOMapMethod();
this._material.diffusePass.addMethod(maskmapMethod);
maskmapMethod.lightTexture = egret3d.CheckerboardTexture.texture;
}
}
摘自网络的一张环境光遮蔽效果图你可以对比左右两张图片查看AOMapMethod带来的不同效果
![](aoMap.png)
----------
* 颜色渐变叠加ColorGradientsMethod的使用
* 通过参数控制相对屏幕位置的高度min和max和颜色color获得渐变效果
* 小于min的部分保持原来的颜色介于min和max之间的部分用渐变过度改变颜色高于max的部分使用颜色和原来的颜色值做alpha混合
* 该功能可用于在模型上面展示进度条的更新效果。
----------
class ColorGradientsMethod {
protected _material: egret3d.TextureMaterial;
protected method:egret3d.ColorGradientsMethod;
protected color:egret3d.Color;
protected span:number = 10;
protected onInit3D(): void {
this.method = new ColorGradientsMethod();
this.color = new Color(0, 1, 0, 0.8);
this.method.setStartData(-this.span, this.span, this.color);
this._material = new egret3d.TextureMaterial();
_material.diffusePass.addMethod(this.method);
}
}
![](gradient.gif)
----------
* 雾,在场景中加入雾效使环境更加逼真,增加带入感
* 3D渲染中雾有很多种多用为距离雾和高度雾。
* 通过设定雾的颜色,透明度,最远最近距离,强度等属性控制雾的实时效果。
----------
class FogMethod {
protected onInit3D(): void {
var material: egret3d.TextureMaterial = new egret3d.TextureMaterial();
var method: egret3d.FogMethod = new egret3d.FogMethod();
material.diffusePass.addMethod(method);
method.fogAlpha = 0.5;
method.fogColor = 0xff00ff;
method.fogHeight = 1000;
method.fogStartDistance = 500;
method.globalDensity = 1;
}
}
示例图片为高度雾在场景中物件上生效后的显示。
![](fog.png)
----------
* 光照贴图LightMap的使用
* 在三维软件里布置好灯光,调整完参数后,将场景各表面的光照信息输出到贴图上,于引擎中还原光照效果。
* 导出的素材中包含有光照贴图第二UV叠加上其他颜色信息还原三维软件中的灯光效果。
* 该类型的灯光为静态光,即不适合具有动态信息的光源,以及场景中能够自由缩放/旋转/位移功能的对象,不推荐在使用了灯光贴图之后,继续添加其他动态灯光。
* 需要在场景中加入灯光的时候,使用该功能相比动态灯光效率更高,合理的使用能大大提升您的程序性能。
* 扩展你可以使用HDR贴图获得范围更广的灯光渲染效果。
----------
class LightmapMethod {
private view1: View3D;
private texture:Itexture;
private lightTexture:ITexture;
protected onInit3D(): void {
var material: TextureMaterial = new TextureMaterial(texture);
material.diffuseTexture = texture;
var plane: Mesh = new Mesh(new PlaneGeometry(), material);
var method: LightmapMethod = new LightmapMethod();
material.diffusePass.addMethod(method);
method.lightTexture = lightTexture;
plane.material.blendMode = BlendMode.ALPHA;
plane.material.cutAlpha = 0;
this.view1.addChild3D(plane);
}
}
示例展示为平面模型使用贴图A叠加以贴图B为灯光图后的结果图C
![](lightMap.png)
----------
* UV动画逻辑循环内通过渐进式改变uv坐标来实现动画的效果
* 设置材质球的repeat参数为true使uv取值到0-1范围之外的时候能够强制重新归到有效范围之内
* 使用4方连续的贴图能够实现uv平滑无限滚动。
----------
class uvRollMethod {
private view1: View3D;
private texture:Itexture;
protected onInit3D(): void {
var material: TextureMaterial = new TextureMaterial();
material.diffuseTexture = texture;
material.repeat = true;
material.blendMode = BlendMode.ADD;
this.plane = new Mesh(new PlaneGeometry(1000,1000,100,100,1,1), material);
this.view1.addChild3D(this.plane);
var uvRollMethod: UVRollMethod = new UVRollMethod();
material.diffusePass.addMethod(uvRollMethod);
uvRollMethod.start(true);
uvRollMethod.speedU = 0.0005;
uvRollMethod.speedV = 0.0;
plane.material.blendMode = BlendMode.ALPHA;
plane.material.cutAlpha = 0;
this.view1.addChild3D(plane);
}
}
示例展示为uv滚动动画
![](uvRoll.gif)
----------
* 序列帧动画逻辑循环内跳跃式改变uv坐标来实现动画的效果
* 相比UV动画该功能为跳跃式的改变uv坐标到指定的起始位置和范围达到用一张贴图实现了逐帧播放的效果
* 需要预先处理多个贴图帧至同一张贴图中引擎根据行数和列数动态计算uv坐标和范围
----------
class UVSpriteSheetMethod {
private view1: View3D;
private texture:Itexture;
protected onInit3D(): void {
var material: TextureMaterial = new TextureMaterial();
material.diffuseTexture = texture;
material.repeat = true;
material.blendMode = BlendMode.ADD;
this.plane = new Mesh(new PlaneGeometry(1000,1000,100,100,1,1), material);
this.view1.addChild3D(this.plane);
var uvSpriteSheetMethod: UVSpriteSheetMethod = new UVSpriteSheetMethod(34,6,6,3.0);
uvSpriteSheetMethod.start();
material.diffusePass.addMethod(uvSpriteSheetMethod);
plane.material.blendMode = BlendMode.ALPHA;
plane.material.cutAlpha = 0;
this.view1.addChild3D(plane);
}
}
示例展示为uv序列帧动画
![](uvSheet.gif)
----------
* 流光特效(StreamerMethod)
* 用来实现UV流光滚动效果的渲染方法
* 在3D游戏中用来制作物体/装备流光的特效显示,比如《奇迹》中的装备流光;
* 需要预先准备一张用于UV滚动的贴图为了突出UV滚动效果该贴图的明暗区间对比明显。
----------
class UVSpriteSheetMethod {
private view1: View3D;
private texture:Itexture;
protected onInit3D(): void {
var material: TextureMaterial = new TextureMaterial();
material.diffuseTexture = texture;
material.repeat = true;
material.blendMode = BlendMode.ADD;
this.plane = new Mesh(new PlaneGeometry(1000,1000,100,100,1,1), material);
this.view1.addChild3D(this.plane);
var method: StreamerMethod = new StreamerMethod();
method.start();
material.repeat = true;
method.steamerTexture = texture;
material.diffusePass.addMethod(method);
plane.material.blendMode = BlendMode.ALPHA;
plane.material.cutAlpha = 0;
this.view1.addChild3D(plane);
}
}
示例展示为uv流光滚动效果
![](streamerAnim.gif)
----------