UE | SingleLayerWater和Translucent截断的问题 | Blurred code

UE | SingleLayerWater和Translucent截断的问题

2025/08/18

LastMod:2025/08/21

Categories: UE

Engine Version: 5.5.4

SLW or Not?

SingleLayerWater和Translucent截断的问题-2025-08-18-23-49-48

选择SLW的理由:

选择半透水材质的理由:

Single Layer Water 截断半透明物体的问题

首先,这是否是个问题

关于SLW截断半透明是否需要处理这个取决于策划和美术的需求... 不过如果是个多端互通的游戏,最好还是考虑处理下,因为在移动端上SLW会退化成一个非常简单的半透渲染,它不会产生截断其他半透的效果。而在PC端上SLW是一个Opaque的渲染方式 + 写深度,所以会在深度测试阶段截断很多半透明的问题,这里会产生不统一的渲染效果。

SingleLayerWater和Translucent截断的问题-2025-08-19-00-00-00

以塞尔达为例,其磁力命中宝箱时产生的命中特效是一个圆圈,但是显然这个圆圈特效被水面渲染截断了。但是实际从游戏体验上来说,并不会造成很明显的视觉瑕疵。

如果要解决,如何解决

碰到了和这个朋友碰到的同样的问题,这里记录一下解决方案。

UE渲染学习(1)- SingleLayerWater遮挡半透明 - 知乎

关于Before DOF / After DOF阶段的半透问题

这两个阶段的半透会开启深度测试,如下图所示,只有After Motion Blur阶段的半透虚幻会关闭深度测试。

SingleLayerWater和Translucent截断的问题-2025-08-18-23-56-43

由于SLW在PC端会写入深度,这样深度测试的时候就会被水面阶段。

上面知乎的那个朋友的思路是在SLW渲染结束后,将深度图替换为不带SLW的,然后过了半透以后,再替换回来。

graph TD A[RenderSLW]-->B[Replace SceneDepthZ] B-->C[Render Translucency] C-->D[Reapply SceneDepthZ]

尝试了一下是可行的,唯一要注意的几个点:

After Motion Blur阶段的半透问题

由于虚幻在这个阶段默认禁用深度测试,所以一般在这个阶段的半透都要在材质里手动处理深度测试,通过DepthFade等方式。

这里的改造可以有两个思路。

  1. 如果做了上一步替换SceneDepthZ的改造,那么DepthFade就没有什么需要改造的。
  2. 如果没有做上一步的改造,那么这里可以考虑做一个DepthFadeWithoutWater的节点,同时在TranslucentBasePass结构体里新增加一个SceneDepthWithoutWater的纹理。可以参考材质里的SceneDepthWithoutWater这个节点的实现,虽然这个节点只允许在SLW材质里用,但是稍微改造下源码就可以迁移给半透材质使用。