透明材质控制的三方面都可以归一化为前景控制。前景控制包括本身的值,和UV等;对于这些的控制可以实现不少效果,下面结合实践围绕一些材质特性进行讲解!
对Unlit Translucency材质半透特性的实践:
从一个不受光(Unlit)的透明材质开始,采样了背景颜色(SceneColor)并乘以一个自定义颜色;把它付给一个球体模型,并包裹目标;按预期的那样,通过采样背景作为前景(SceneColor*自定义颜色)的控制方式改变了特定区域的效果。
接下来把这个效果的特定区域进一步限定到仅影响目标物体;这可以通过打开目标的Custom Stencil来做Mask来实现。(项目设置中Custom Depth-Stencil Pass: Enabled with Stencil;对象Actor打开Render CustomDepth Pass并设置一个CustomDepth Stencil Value,这里为1)
这里并没有利用控制背景(Opacity)来限定区域,而全都通过控制前景Lerp SceneColor的方式实现了。
上面提到利用控制前景来模拟背景控制的方式执行效率上不同情况会变化,这里反而控制背景比控制前景实现方式增加几个指令(比较上下两图统计数字72vs70)。
除了SceneColor,延迟渲染下还可以拿到其他G-Buffer信息,所以可以修改这些信息,然后混合回SceneColor;
PS: 这里用到“混合回”的描述是因为这是类似后期效果,可以理解为对已有背景信息的滤镜处理。并不能真正改变渲染在BasePass时的信息,如果需要更新Gbuffer本身可以通过之后提到的Deferred Decal材质来实现。
利用采样Ambient Occlusion加强或弱化对象的AO效果(通过对AO处理后叠回SceneColor)。
利用SceneColor和BaseColor,对对象去色/或降低和提升饱和度。
PS:这里的透明模型为了减少OverDraw的开销,尽量减少透明的区域,因此使用了包裹对象更加紧凑的模型替代了球体。(这个模型可以利用引擎内生成的Simple Collision凸物体)
利用Worldposition(世界空间像素位置):不同于可以直接拿到背景的G-Buffer信息,透明材质无法直接在SceneTexture中选择拿到背景的WorldPosition,需要做一些计算。
我们叫它透明物体后场景的世界位置(Worldpostion Behind Translucency):计算方式为从摄像机的位置为起点朝摄像机和材质像素连接方向延申到场景深度,然后把它作为一个材质函数复用。
利用它计算出和透明体Pivot的距离而生成一个从透明体中心到边缘的黑白球形遮罩;
利用控制深度的容差产生沟边,相较于全屏后期处理,好处是基于Actor世界空间位置,区域可控
结合可以做一些基于物体世界位置的后期效果;比如3D空间中选择目标区域的高亮绘制。
PS: 以下的效果可以在角色身上利用Sphere Mask节点并结合Tick手部位置的传入信息来实现;但使用一个额外的透明球体实现自由高效的多。
如果把法线也考虑进来,得到屏蔽掉法线背向球心遮罩;两者结合改变背景颜色和亮度,模拟非投影点光效果。
通常透明材质贴图(前景贴图)UV来自于模型本身UV,因为透明材质可以取到背景信息的特性,可以利用背景的信息来改变其UV,比如利用上面提到的背景WorldPosition。
利用它的X,Y作为前景贴图的UV,来实现模拟从上而下类似Decal的投影,比如可以用来模拟假阴影;也可以应用到特效中Mesh上产生投射效果(包括下面说到3轴的投射),作为目前特效无法生成Decal的备选方法。
利用它的 X,Y,Z作为前景贴图UV来实现类似BOX UVmapping的世界空间3轴投射,叠加到背景目标体上效果,改变目标体贴图。
除了World Position作为背景UV,有时希望获取背景目标Tangent Space的UV坐标,作为前景贴图的UV,做一些特效,比如替换贴图。
综上实践我们可以了解到Unlit Translucency材质可以应用到角色材质技能特效,避免把效果都写入角色材质中增加复杂度和维护成本,这些特效材质还可以被重复利用到不同角色身上。
,Unreal Engine技巧,Unreal Engine教程