UE4-DeferredDecal
大佬们的文章链接参考:
https://zhuanlan.zhihu.com/p/666213716
https://zhuanlan.zhihu.com/p/100748588
1. UE的DeferredDecal
UE的延迟贴花有两种版本,一种是使用DBuffer,还有一种不使用DBuffer。
不使用DBuffer的情况
首先有一个BOX来划定范围,投射方向。
原抓帧路径通过体积与模板优化限制有效像素;具体是否采用两次 BOX 绘制、剔除方向与模板位,取决于相机位置、材质和引擎路径,不是所有贴花的固定步骤。
第一次,关闭Cull,画Stencil:

后续按该路径设置 Cull 与模板比较;下图的模板值属于当前抓帧状态,不能当作通用常量:

BOX的范围内,深度图转换为WorldPos,然后再转换到BOX空间。
使用BOX内的空间坐标采样Decal图,然后加到Gbuffer里。
如果Decal需要光照后面就也可以计算实时光照,但是无法计算BakeLight,因为BakeLight是在BasePass里画Gbuffer的时候已经算完了。
使用DBuffer的情况
将Decal的数据画进DBuffer里。
DBuffer 贴花在 BasePass 之前累积材质属性,BasePass 读取并应用到接收材质,再进行相应着色与输出。这使相关贴花属性能影响当前烘焙光照的显示响应,并不是重新计算已烘焙的全场景间接光。

原记录图解

原笔记配图:原路径的深度和模板状态;具体正反面规则受视点、材质和渲染阶段影响。

原笔记配图:旧材质界面的 DBuffer 选项,具体可用性由项目配置和渲染路径决定。

原笔记配图:某个 DBuffer 分量的抓帧观察,不能仅由颜色推断全部缓冲语义。

原笔记配图:另一 DBuffer 分量的抓帧观察,用于与对应材质写入路径核对。
2. 接入与成本
本文面向原 UE4 延迟路径。DBuffer 开关、材质混合模式和接收面支持需要配套;UE5 的默认路径不能直接由旧抓帧推断。若贴花修改法线,法线空间与混合方式也要一致。
体积投影会覆盖屏幕区域,多层贴花会重复读写。缩小投影盒、减少不必要通道和控制排序复杂度,往往比只减少贴花贴图分辨率更直接。
总结
延迟贴花利用深度重建把屏幕像素映射到投影体积;DBuffer 改变属性介入着色的时机。模板数值和绘制次数属于实现细节,读者应追踪自己的分支。