为了能够熟练使用UE4进行工作,我们需要了解UE4的编辑器、引擎、蓝图、材质、编程等等内容,其中透明物体相关问题经常会被开发者提及。下面为大家展示UE4中透明材质的应用,以便开发者快速定位解决相关问题。


Lit Translucency(受光透明材质):


光影及明暗和普通Surface材质很不一样;


相对于CG中使用三角面Surface来表现实体不同,现实中透明物体可以看到物体内部,其实是一个“体”的概念。光影的变化是基于体积(或者厚度)的一个积累后的结果。比如透明度的变化,亮度,阴影的浓度,折射对光线的扭曲程度都直接和其“体”量有关。比如我们平时看到的水池就是个体,玻璃也是体,云雾也是体。


需要注意的是,物理属性上讲利用透明材质表现头发,树叶这种镂空效果其实不属于透明材质本质特性的应用,而是为了减少顶点数利用了透明材质可部分透明的特性罢了,是很“游戏”的一种应用方式。


UE4中Lit Translucency如何处理光影


谈这个的原因是这部分和Surface的处理很不同,为了平衡效率和效果,比较复杂多样,因此也引起不少疑惑以及问题。分光照和阴影两部分


光照方面透明材质有几个特定的灯光模式可以选择。其中除了Surface ForwardShaing外,这些光照计算结果需要基于Volume Texture,在一个3D空间中积累明度;Volume Texture精度有限,受光和阴影品质也受到限制。




透明材质阴影比较多样,根据使用不同类型灯光,阴影投射对象的材质属性,阴影接受对象的材质属性,是否自阴影等因素,阴影的表现方式部分利用到上面提到的Volume Texture,部分使用了FOM(Fourier Opacity Map),部分是利用Shadow Depth Map,部分就使用Lightmap;另外目前有些在实践中并不工作(bug);因此难以定位问题或者利用好,这里总结了一个图表,描述了各种情况下阴影的方式,希望对更清晰地理解和定位问题。


UE4如何理解与应用透明材质

从左到右:灯光类型-投射阴影物体类型-阴影方式-接受阴影物体类型


然后以玻璃为例谈下以“体”的思路模拟表现受光透明材质


UE4如何理解与应用透明材质


分析照片可以看出,同一种材质


   ●  透明度随着厚度变化:厚度决定背景光线穿过材质到达摄像机的距离,距离决定被吸的光量,穿透光量决定透明度;因此越薄吸收越少就越透明,反之越不透明;


   ●  固有色随着厚度变化:我们看到的颜色更多的是光线穿越材质后被吸收掉某种波长的光谱而产生的颜色,材质在视野角度越厚,吸收越多,颜色越浓,也越暗;


   ●  折射随着厚度变化:现实中背景被折射偏移的程度除了材质本身折射率属性还取决于厚度,即光线在此材质中经过的距离,距离越大出材质后产生的偏移越大。由于玻璃球中间和边缘厚度变化,导致折射产生的光线偏移不均匀,景象产生弯曲;同样是透明球体肥皂泡几乎没有厚度所以基本无折射。


实现上首先为了更好的表现高光和反射选择Surface Forward Shading的光照模式


   ●  玻璃透明度随着Opacity的减小,高光和反射同时也被消弱,接近0时,高光和反射基本消失。为了保持高光反射强度,可以通过控制前景来控制背景,即不连接Opacity,而采样SceneColor作为前景。


   ●  玻璃颜色来自于光线某些波长的被吸收,因此并非BaseColor(Surface上的漫射颜色),所以通过设置BaseColor=0基本放弃了漫射,同时通过取 SceneColor乘上颜色连接到自发光通道的方式来染色,颜色需要根据厚度有变化。


   ●  玻璃折射,因为需要用到取背景SceneColor通过自发光来染色,因此这里放弃了材质本身的Refraction通道,而是通过偏移SceneColor的UV来模拟;同样折射的程度与厚度相关。下图A和B为不同厚度的同一材质光线出入其中后产生的偏差;可以看到介质越厚,光线被偏移的距离越大。


UE4如何理解与应用透明材质


因此要表现比较真实的折射效果需要在材质里定义对象的厚度,这个厚度为从摄像机角度看过去的厚度,因此非固定贴图可以表现;对于球形对象可以利用Fresnel节点,或者DOT模型法线和Camera Vector的结果作为灰度蒙版来变化折射率(这里是UV的偏移程度)。


以下是没有定义厚度作为折射率蒙版(第一幅),以及不同灰度变化定义厚度作为折射率蒙版指定给一个球体模型后产生的结果;模拟现实中不同类型镜片。


UE4如何理解与应用透明材质


但对于非球体Fresnel的信息无法正确表达厚度,需要想办法来创造它。一个实体的厚度是光线进实体和出实体的距离,即前后表面的深度差,这可以利用当前表面的Pixel Depth和法线反转模型的CustomDepth求差得出。


具体做法是把两个相同模型叠套在一起,一个法线正常用于绘制,一个法线反转用于产生深度。反转法线模型开启Custom Depth,赋予一透明材质,并打开Allow Custom Depth Writes, Opacity 0不被绘制,需要注意的是设置Opacity Mask Clip Value也为0,确保其透明度为0时也会绘制Custom depth。


法线正常的面是需要被绘制的玻璃,材质中需要采样到反转法线面的Custom depth信息,计算模拟模型在不同视角的厚度;此厚度作为Alpha权重使得不同厚度的地方有不同的固有色和折射。


一个圆锥在不同视角中厚度变化


UE4如何理解与应用透明材质


应用到模型上最终效果可以看到颜色,透明度及折射(这里可能不是特别明显)随着厚度的变化;同时保持住了足够的高光和反射


PS: 4.25版本中将增加专门的Thin Transparency Shading 模型来实现染色玻璃材质;基于PBR提供了很好的高光反射保持以及表现滤色的功能,但厚度仍需额外营造。


UE4如何理解与应用透明材质


总结:


 ●  透明材质没有深度,由此会产生问题,但也可巧妙利用。


 ●  透明材质本质特性是可以半透明,镂空效果并不是透明材质本质特性的最好应用。


 ●  透明材质最终效果取决于三方面:控制前景,控制背景可见性(Opacity),混合方式(Blend Mode)。


 ●  采样SceneColor作为前景的方式提供了对Opacity,Blend Mode的模拟;自由度和效率在不同情况各有变化。


 ●  可以通过采样背景的各种信息实现很多区域性的后期效果;并有着后期材质无法比拟的灵活性,应用想象空间丰富。


 ●  透明材质的动态光影有局限性,需要精细应对。推荐最低限度地使用高级灯光模型和投射阴影。


 ●  用“体”的思维去考虑创建受光的透明材质。


只要理解UE4透明材质,并且巧妙使用这些材质进行工作,就能够缩短工作流程与时间。希望上面知识能帮到你。

,Unreal Engine技巧,Unreal Engine教程