贴花渲染
Decal Rendering
贴花 (decal) 是叠加在表面上的图案或纹理,如轮胎印、弹孔、玩家喷漆、标志。贴花可只改颜色(纹身)、只改凹凸(压印标志)或换成完全不同的材质(车窗贴纸),可多个叠在同一几何上,也可横跨多个模型。主流做法是用有向盒做正交投影的投影贴花;延迟着色把贴花效果直接写进 G-buffer,分簇前向着色则把贴花像光源一样放进簇列表。
附着在网格上的贴花(20.2 节)
| 方法 | 做法 | 缺点 |
|---|---|---|
| 额外顶点纹理坐标 | 每个贴花一套 uv | 每顶点可存的值有限;大量小贴花也要在每个顶点存坐标 |
| 着色器内采样所有贴花 | 逐个采样并混合 | 着色器复杂;贴花数变化时要频繁重编译 |
| 每个贴花再渲染一遍网格 | 逐遍叠加混合;跨几个三角形时可建更短的子网格索引缓冲 | 多遍开销 |
| 修改材质纹理 | 只用于一个网格(如地形)时"设好就不管";多物体共享时需烘焙新纹理 | 纹理管理与内存开销 |
通常单独渲染贴花,这样同一表面可用不同分辨率,基础纹理也能重复使用而无需修改副本。这些方法适合 CAD 中添加单个标志,也用于动画模型——贴花需在形变之前投影,才能随物体拉伸;但贴花一多就低效繁琐。
投影贴花
对静态或刚体物体流行的做法:在场景中放一个有向盒,贴花像电影放映机一样从盒子一面正交投影到对面。
flowchart LR
A["光栅化贴花盒的面, 驱动像素着色器"] --> B["读取该像素表面深度与屏幕位置"]
B --> C["换算到盒的局部空间"]
C --> D{"在盒内?"}
D -- "是" --> E["得到贴花 uv, 混合到表面材质"]
D -- "否" --> F["丢弃"]如上图,盒内的任何几何都会被贴上贴花;贴花也可以是真正的体积纹理。实践中盒子尽量做得又薄又贴合表面,以减少被测试的像素。控制手段:用 ID、模板位或渲染顺序让贴花只影响盒内某些物体;按表面角度与投影方向渐隐或截断,避免表面接近侧视时被拉伸变形。
延迟着色中的贴花
延迟着色擅长这种贴花:前向着色要对每个贴花做光照和着色,而延迟着色直接把贴花效果写进 G-buffer(如胎印替换着色法线就直接改法线缓冲),之后光照只读 G-buffer,避免前向的着色过度绘制,着色阶段也不再需要贴花本身。这还避免了多遍前向着色中"一遍的表面参数需影响另一遍光照"的问题。这种简单性是 Frostbite 2 从前向转向延迟着色的主要原因之一。贴花和光源本质相同:都是渲染一个空间体积来决定对其中表面的影响。
延迟贴花的问题(Lagarde 与 de Rousiers):
- 混合只能用合并阶段提供的运算。
- 材质与贴花都有法线贴图时很难正确混合,使用凹凸纹理过滤技术时更难。
- 可能出现黑白镶边瑕疵;可用有符号距离场锐利地分隔材质,但会带来走样。
- 贴花轮廓处因屏幕空间信息反投影回世界空间导致梯度错误而镶边;可限制或不用 mipmap,更复杂的方案见 Wronski。
分簇前向中的贴花
《DOOM》(2016)把光源、环境探针和贴花一起插入裁剪空间簇。前向着色时遍历所在簇的所有贴花,与表面重叠就取纹理值混合,混合方式任意(不受合并阶段限制),而且贴花也能用于透明表面——这是延迟方式做不到的。
应用
贴花既用于动态元素(刹车痕、弹孔),也用于给不同地点增加变化:墙面纹理可以复用,贴花提供定制细节,让每栋建筑各具特色(书中示例场景约 200 个贴花)。地形或城市中,贴花可叠加细节纹理或以不同方式重组图案,避免明显重复。
GEA 的视角:投影贴花的做法(卷 II 11.6.6)
- 贴花是叠加在常规几何上的一小块几何,用来动态改变表面外观,例如弹孔、脚印、划痕、裂缝(卷 II 11.6.6)。
- 现代引擎最常用的做法:把贴花建模成沿一条射线投入场景的矩形区域,在三维空间中形成一个长方体棱柱;棱柱最先碰到的表面成为贴花表面。提取被碰到几何的三角形,用棱柱的四个侧面裁剪,再为每个顶点生成贴花纹理坐标,叠画在常规场景之上。
- 常配合视差贴图营造深度感(顽皮狗《神秘海域 3》的弹孔贴花,见 视差贴图),并加一点 z 偏移避免与底下几何发生 z-fighting,GEA 说通常通过略微移动近平面实现。
- 这种做法介于本页 RTR4 部分的两类之间:像「投影贴花」一样用一个棱柱/盒体确定作用范围,又像「附着在网格上的贴花」一样提取、裁剪出贴花自己的几何再单独渲染。延迟着色和分簇前向中的贴花 GEA 没有展开。
出处
- realtime_rendering_4ed.pdf 第 20 章 Efficient Shading
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.6.6 节