GameTech/URP 渲染实战

案例 22.2DBuffer 与屏幕空间对比入门

目标:同一组贴花在两种技术下的效果与取舍。

图 22-3同一面砖墙上的弹孔(带法线)和地面的警示条纹。左:DBuffer;右:Screen Space(Normal Blend 选 Medium)。在这种简单场景里两者几乎看不出区别

两张图看起来差不多,这恰恰是值得强调的结论:对“颜色为主、法线为辅”的常见贴花,屏幕空间技术的画面已经足够好。真正的差别在看不见的地方:

DBufferScreen Space
额外 PassDepthNormals 预渲染 + 拷贝深度 + DBuffer 绘制只有贴花盒子本身(需要深度图)
额外显存/带宽1~3 张全屏 RGBA8 + 法线图几乎没有
能修改的属性反照率、法线、金属度、AO、光滑度,受光完全正确反照率、法线(重建),画在光照结果之上
对自定义 Shader 的要求接收方要加 DBuffer 关键字并调用 ApplyDecal无要求,任何不透明物体都能被贴
适用平台桌面、主机(需要 MRT4,不支持 OpenGL)全平台,移动端的默认选择
怎么选如果项目已经因为 SSAO 等原因开启了 DepthNormals 预渲染,DBuffer 的增量开销就小了很多,又能做“雨后地面变光滑”这类改光滑度的贴花,值得用;移动端或者贴花只是零星点缀时,用屏幕空间。注意 DBuffer 的接收方必须是支持它的 Shader——用了本书前面章节的自定义 Shader 的物体上,DBuffer 贴花不会出现,这在排查“贴花不显示”时很容易被忽略。