【转载】UE4 半透明材质的折射与反射笔记

1,416 阅读5分钟

版权声明:本文为CSDN博主「a1406215966」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:blog.csdn.net/a1406215966…

参考

参考官方文档折射:

操作流程如下

一、新建材质

1.1 配置材质属性

  1. 将材质模式改为半透明,启用双面材质,将光照模式改为后两种其中之一,SurfaceForwardShading 消耗比 SurfaceTranslucencyVolume ,原因最后分析(SurfaceTranslucencyVolume\SurfaceForwardShading
  2. 可以选择启用 ScreenSpaceReflections, 此选项可以使材质对周围空间进行准确的反射,性能消耗较高

image.png

1.2 按下图连接材质

image.png

其中的 IOR 代表折射率,20211231 日修订:根据:官方文档说明(翻到最后),折射率直接连到 specular 上即可。文章中还列举了半透明材质在开启光追中的性能优化方案。此链接中的文字摘录如下:

半透明折射率(IOR)

在为光线追踪设置并使用折射时,高光(Specular) 材质输入用于控制半透明材质的折射率(IOR)。 虚幻引擎的光线追踪特性遵循 Disney 的 BRDF 模型,其中反射值和 IOR 值是耦合的,不能独立定义。

光线追踪功能优化

设置反射和半透明最大粗糙度(Setting Reflections and Translucency Maximum Roughness)

使用 最大粗糙度(Max Roughness) 在材质上设置光线追踪反射的阈值。可在后期处理体积内,或使用控制台命令 r.RayTracing.Reflections.MaxRoughness 完成此操作。

设置全局照明、反射和半透明的最大光线距离(Setting a Maximum Ray Distance for Global Illumination, Reflections, and Translucency)

这项将设置此类功能的最大光线距离,以降低其在场景中的开销和贡献。 使用控制台设置此类光线追踪功能的 MaxRayDistance 控制台变量。这些功能位于 r.RayTracing.* 下。

RTGI 优化(RTGI Optimizations)

现在,屏幕百分比和逐像素采样分别默认为 50 和 4。如需将其设为其他值,默认使用其控制台命令进行设置:r.RayTracing.GlobalIllumination.ScreenPercentager.RayTracing.GlobalIllumination.SamplesPerPixel 。 可使用光源的 影响全局照明(Affect Global Illumination) 属性启用/禁用 GI 的光照贡献。

二、场景配置

项目设置中启用 RTX 并在后处理中将半透明的反射模式改成 RayTracing,并用反射球捕获场景或者指定 cubemap

2.1 效果展示

image.png

2.2 未启用 Raytracing

未在后处理中启用 Raytracing 的效果

image.png

image.png

2.3 使用单面材质

想折射效果好需要启用双面材质,不然单面材质就是下图这种效果:反射效果差一些

image.png

2.4 颜色配置

颜色不要给纯黑纯白,效果不理想,纯白纯黑如下图所示

image.png

2.5 半透明度配置

通过给半透明度合理的值,使得反射和折射效果达到最佳的融合效果,透明度太小或者太大就会出现下图中的效果,太小导致反射看不到,太大导致反射太强烈,折射效果被掩盖。

image.png

2.6 粗糙度配置

粗糙度稍微给零点零几即可,否则没有高光点

2.7 后处理半透明反弹次数

后处理中半透明的反弹次数越大透明材质内部越亮,但性能消耗越多。默认的 3 次反弹效果就不错,当反弹次数设成1后会是下图的效果

image.png

三、折射率(IOR)可以按照下图给出的不同材质标准值设置:

image.png

四、两种 LightingMode 分析

SurfaceForwardShadingSurfaceTranslucencyVolume, 他们的名词解释:

  • SurfaceForwardShading:照明将计算一个表面。把它涂在半透明的表面上,比如玻璃和水。这是通过前向阴影实现的,因此局部光源的镜面高光被支持,然而许多仅延迟的特性是不支持的。这是最昂贵的半透明照明方法,因为每个光的贡献是按像素计算的。
  • SurfaceTranslucencyVolume:照明将计算一个表面。光线在一个体积中积累,所以结果是模糊的,有限的距离,但每像素的成本非常低。把它涂在半透明的表面上,比如玻璃和水。仅支持漫射照明。

对比来看前者的性能消耗是最高的,测试在 4K 画面下,下图左图为 SurfaceForwardShading 模式(24ms),右图为 SurfaceTranslucencyVolume 模式(24 ms)基本没差别

image.png

image.png

这么看来两者的消耗貌似没什么差别,我将后处理的反弹次数增大到 50 并拉进观看时还是性能依然没有明显差别

image.png

image.png

咳咳,可能是本人电脑过于强大,嘻嘻,开个玩笑,打开,材质复杂性显示,可以明显看出下面 10 个球的的复杂性要更高(下面十个10球给的是 SurfaceForwardShading 类型材质,上面 15 个是 SurfaceTranslucencyVolume 材质)

image.png

从编辑器效果测试来看,在拉远距离后,前者光照模式的高光还在,后者在拉远距离后高光点基本快消失没了,效果如下两图所示:

image.png

image.png

五、两种 Refraction 模式

在材质设置中有下图这个设置,根据每项的说明,显示:

  1. 按照折射率:这种适用于玻璃球等对象
  2. 像素法线偏移:适用于水面材质

image.png

六、总结

两种类型在效果上差别不大,场景性能占用上也无明显差别。但是材质复杂度相差不少,我发现两种材质模式在编译速度上有差别复杂的 SurfaceForwardShading 模式编译材质在 8 秒左右,SurfaceTranslucencyVolume 则需要 5 秒。所以不要求极致效果的话使用 SurfaceTranslucencyVolume 灯光模式即可。