在UE5里给角色或物件加描边,不少人第一反应就是上后处理,用自定义深度通道做边缘检测。这套方案对不透明物体非常好用,但一旦换成半透明材质,比如能量罩、传送门、幽灵虚影、玻璃瓶身,你会发现同一个后处理完全失效,描边像凭空消失一样。我一开始也卡在这,反复检查材质节点和后处理体积都没问题,最后翻了源码和论坛才明白根因:半透明物体压根不会被写进自定义深度通道,你没让它“存在”在描边的依据里,效果当然出不来。
这篇文章就围绕这个点展开,把原理、官方解法、备用方案和踩坑经验完整讲透。不管你是做风格化渲染、科幻特效,还是想给特定物体做高亮描边,都可以照着做。
1. 先搞清楚:自定义深度通道为什么“看不见”半透明物体
1.1 UE5渲染管线的Pass顺序
要理解这个问题,先得知道UE5渲染一帧时,各阶段大致是这样走的:
- 深度预 pass(PrePass / Depth Only):只写深度,为后续剔除和降噪服务。
- 基础 pass(BasePass):渲染不透明和遮罩物体,写入GBuffer,包含颜色、法线、粗糙度等。
- 阴影 pass(Shadow Pass):生成阴影贴图。
- 半透明 pass(Translucency Pass):渲染Blend Mode为Translucent的物体,不写GBuffer深度。
- 后处理(PostProcess):全屏处理,NDC颜色调整、Bloom、描边等都在这时候做。
描边用的CustomDepth,其实是一份独立于主场景深度的额外缓冲。引擎在BasePass前后,会再额外跑一次“自定义深度渲染”,但这次渲染只处理那些勾选了 Render Custom Depth Pass 的物体。
问题就出在:默认情况下,这个自定义深度渲染列表里没有半透明物体。半透明物体走的是独立的Translucency Pass,而CustomDepth pass在筛选渲染对象时,压根不把它们算进去。
1.2 半透明材质为什么不写CustomDepth
从材质Blend Mode的角度看,UE5里半透明不使用Opaque那套渲染状态。它不写入主深度缓冲,也不需要光照响应,渲染时按从后往前的顺序排序,用于做玻璃、烟雾、能量场这类效果。
CustomDepth这一层,设计时主要就是给不透明物体当“后处理标记位”用的。官方文档里也写得很明确:CustomDepth和CustomStencil默认只作用于不透明几何体。哪怕你手动把MeshComponent的Render Custom Depth Pass打开,如果材质本身是Translucent、且没有单独声明允许写入自定义深度,渲染器依然会跳过它。
所以整个逻辑链是这样的:
- 描边需要边缘数据,边缘数据来自CustomDepth或CustomStencil。
- CustomDepth渲染列表里没有半透明物体。
- 半透明物体的颜色最终合成到屏幕,但没有任何一个缓冲记录它的“轮廓位置信息”。
- 后处理描边自然无从谈起。
我用一个生活化类比:你要在照片里找一个人的背影,但那个人根本没有站进拍照区域,只是在旁边拿投影仪投了个虚影。相机拍不到他的实体,你怎么后期描边都描不中。半透明物体就是这样,它只投了个“视觉虚影”到屏幕上,CustomDepth这张“名单”上没它名字。
1.3 CustomStencil也没用吗
有些朋友想着,深度不行,那我用模板Stencil总行吧?CustomStencil默认也一样,只对勾选并且被CustomDepth pass接收的物体写入。半透明物体同样进不了这个pass,所以Stencil值写了也没人理。
这个认知非常重要。很多新手在材质里给半透明物体设置CustomStencil值,然后在后处理里读,结果读出来全是0,就是因为根本没进入写入阶段。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案的底层逻辑:两条路,目标都是“让描边有据可依”
既然问题的本质是“透明物体没有写入CustomDepth”,那么解决方案无非两条路:
2.1 思路A:让半透明物体本身也能写入CustomDepth
这个思路最
