中EN
概念页

贴花渲染

Decal Rendering

更新于 2026-10-16 约 4 分钟贴花投影贴花延迟贴花G-buffer分簇前向

贴花 (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 没有展开。
  1. realtime_rendering_4ed.pdf 第 20 章 Efficient Shading
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.6.6 节

相关页面

图形学延迟着色Deferred Shading延迟着色先用一遍几何 pass 把所有可见表面的材质参数写入多张渲染目标(G-buffer),再以后处理方式对这些存储值逐光源计算光照,从而把"几何可见性"与"光照"彻底解耦,并把材质与光源分离。它避免了着色的过度绘制、简化了着色器管理、天然适合贴花,但 G-buffer 占用显存和带宽,且难以直接支持透明和 MSAA。本页也覆盖前向渲染下限制光源影响范围的基础手段与"光照预通道 (light prepass)"类混合方案。图形学分簇着色Clustered Shading分簇着色把整个视锥(而不只是屏幕平面)划分为三维单元——簇 (cluster),按簇建立光源列表。与依赖场景几何深度的分块着色不同,簇的划分与几何无关,可只由视图和光源计算,因此对相机位置的性能波动更小、对深度不连续更稳健,并为不透明、透明、体积物体提供统一的光照方案。它同样可配合前向或延迟着色,并衍生出 z-binning、光源树等更省内存的变体。本页还汇总了各类多光源方案的对比。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。图形学法线贴图与凹凸贴图Normal & Bump Mapping凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学隐式曲面与有符号距离函数Implicit Surfaces & Signed Distance Functions隐式曲面用 f(\mathbf{p})=0 定义:代入点结果为零即在曲面上。返回到最近表面有符号距离的 f 称为有符号距离函数 (SDF)。它们便于做光线求交、构造实体几何 (CSG)、混合与变形,通常用光线步进可视化,也可用移动立方体等方法转为三角形。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。游戏开发 · UE5Substrate 材质Substrate MaterialsSubstrate 用一种更有表现力、更模块化的框架,取代旧材质系统里固定的一组着色模型和混合模式(Default Lit、Clear Coat 等)。材质被看作一块块「物质板 (Slab)」,每块是用有明确单位的物理量参数化的原则化 BSDF,再通过混合、垂直分层等运算组合成图。代价是光照评估更贵,所以提供参数混合和两种 GBuffer 格式(Blendable / Adaptive)来在速度和画质之间取舍。新项目默认启用 Substrate;升级到 5.7 及以后的老项目默认不启用。图形学视差贴图Parallax Mapping法线贴图的凹凸不会随视角移位,也不会互相遮挡。视差贴图用高度场按视角偏移纹理坐标,以几条额外指令换来明显提升;视差遮蔽贴图 (POM,又称浮雕贴图) 沿视线在高度场中步进求交,能表现遮挡和自阴影,但轮廓仍是原始平面。游戏美术断边贴花:从 Fallout 3 到 Cyberpunk POMBroken Edge DecalsGAT 1 与 85:低模断边用贴花/包裹几何补细节;Cyberpunk 2077: Phantom Liberty 进一步用重叠破损网格 + POM 贴花消交线并打碎轮廓。85 明确是 1 的延伸。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原