案例 22.2DBuffer 与屏幕空间对比入门
目标:同一组贴花在两种技术下的效果与取舍。

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