技术博客 | UE4透明材质的理解和应用
利用采样Ambient Occlusion加强或弱化对象的AO效果(通过对AO处理后叠回SceneColor)
普通透明材质仅能拿到Gbuffer信息,但无法写入;因此我们能做的是对这些信息做一些处理后画回SceneColor上。但Deferred Decal可以更新Gbuffer(无Depth),这提供了计算灯光前让我们“改变材质属性”的机会。直观的应用是单独或者同时写入BaseColor,Normal, Roughness等等;
Decal材质还能采样到部分buffer信息,比如 WorldNormal, AO, SceneDepth, CustomDepth, CustomStencil,提供进一步应用想象空间。但它并没有像普通透明材质能看到的背景信息类型那么多(比如无法取到SceneColor)。
非透明材质当然也直接了地写入Gbuffer(有Depth);Deferred Decal的透明材质没有Depth,这个特性决定了Decal是叠加绘制到背景上,非透明材质是直接绘制在当前几何体表面上。另外非透明材质无法单独写入个别材质属性到Gbuffer,而是全部。比如无法单独写入BaseColor而不画其Normal和Roughness。从这点上看如果希望使用Decal完全改变背景的所有材质属性,直接用非透明材质即可,效果类似并高效。
概念的理解有利于增加应用想象空间的自由度:就如同上面角色的特效叠加,效果虽然也是可以直接写在角色本身材质里,但分开作为Mesh Decal的好处除了上面提到的易于维护和减少复杂度外,分开的Mesh还可以有各种动画,变形等,有不少本身复杂材质很难实现的区域效果变化;比如角色的皱纹添加和变形(更新 normal+顶点动画);熨斗烫平褶皱(更新 normal+MeshDecal平移动画);一片有形状区域干湿的变化,这也许跨越了多个物体的多个材质,或者一个材质的部分区域(更新Roughness和BaseColor)。
雾的颜色需要远近可控; 雾的浓度衰减方式需要随距离可控; 雾的颜色和衰减在垂直距离上也需要同样的控制自由度; 在不同朝向(逆光/顺光)需要有不同的颜色,并可控强度; 可排除个别物体受雾影响。
UE4中Lit Translucency是如何处理光影
然后以玻璃为例谈下以“体”的思路模拟表现受光透明材质。
透明度随着厚度变化:厚度决定背景光线穿过材质到达摄像机的距离,距离决定被吸的光量,穿透光量决定透明度;因此越薄吸收越少就越透明,反之越不透明; 固有色随着厚度变化:我们看到的颜色更多的是光线穿越材质后被吸收掉某种波长的光谱而产生的颜色,材质在视野角度越厚,吸收越多,颜色越浓,也越暗; 折射随着厚度变化:现实中背景被折射偏移的程度除了材质本身折射率属性还取决于厚度,即光线在此材质中经过的距离,距离越大出材质后产生的偏移越大。由于玻璃球中间和边缘厚度变化,导致折射产生的光线偏移不均匀,景象产生弯曲;同样是透明球体肥皂泡几乎没有厚度所以基本无折射。
玻璃透明度随着Opacity的减小,高光和反射同时也被消弱,接近0时,高光和反射基本消失,这并不是我们想要的。为了保持高光反射强度,我们通过文章最开始提到的通过控制前景来控制背景,即不连接Opacity,而采样SceneColor作为前景。 玻璃颜色来自于光线某些波长的被吸收,因此并非BaseColor(Surface上的漫射颜色),所以通过设置BaseColor=0基本放弃了漫射,同时通过取 SceneColor乘上颜色连接到自发光通道的方式来染色,颜色需要根据厚度有变化。 玻璃折射,因为需要用到取背景SceneColor通过自发光来染色,因此这里放弃了材质本身的Refraction通道,而是通过偏移SceneColor的UV来模拟;同样折射的程度与厚度相关。下图A和B为不同厚度的同一材质光线出入其中后产生的偏差;可以看到介质越厚,光线被偏移的距离越大。
透明材质没有深度,由此会产生问题,但也可巧妙利用 透明材质本质特性是可以半透明,镂空效果并不是透明材质本质特性的最好应用 透明材质最终效果取决于三方面:控制前景,控制背景可见性(Opacity),混合方式(Blend Mode) 采样SceneColor作为前景的方式提供了对Opacity,Blend Mode的模拟;自由度和效率在不同情况各有变化 我们可以通过采样背景的各种信息实现很多区域性的后期效果;并有着后期材质无法比拟的灵活性,应用想象空间丰富 透明材质的动态光影有局限性,需要精细应对。推荐最低限度地使用高级灯光模型和投射阴影 用“体”的思维去考虑创建受光的透明材质
近期焦点