GPU Gems 1 · Chapter 35. Leveraging High-Quality Software Rendering Effects in Real-Time Applications

把高模和高质量软件 renderer 的材质细节烘焙成硬件友好的低模、顶点属性与纹理,在保留艺术迭代自由的同时控制实时三角形和 shader 成本。

学习目标

  • 能解释为什么高质量软件 renderer 适合生成实时硬件输入,以及高模到低模的内容管线如何保留艺术自由
  • 能区分几何数据、顶点属性和纹理属性,并说明 UV、法线、切线与副切线如何进入硬件 shading
  • 能执行 model-space 到 tangent-space normal map 的两阶段烘焙,并为 diffuse、reflection 和 procedural map 选择合适的生成策略
  • 能用 UV 连续性、形状差异、map 分辨率、烘焙耗时与运行时成本评估一份资产是否达到实时发布标准

GPU Gems 1 第 35 章解决的是一个内容生产矛盾:实时硬件可以执行复杂的 vertex/pixel shader,但 shader 需要丰富、稳定且成本可控的输入;高端软件 renderer 又已经具备多年积累的材质网络、细分、位移、全局光照和环境计算能力。与其重新实现一套离线算法,不如在 DCC 工作流中使用软件 renderer 生成属性,再把结果烘焙到硬件友好的资产。

1. 从高质量内容到硬件输入

是这条管线的核心产物。它把原本只能在高模或复杂 shader 中得到的颜色、法线、反射环境和程序纹理,转成低模运行时可以读取的输入。

software renderer → hardware-ready contentDCC + softwarehigh-res + rich shadersautomated bakeproject high-res detailrender attributesUV parameterizationlow-res meshmaps + vertex attrsGPURT保留的语义颜色、法线、位移细节、反射环境和材质网络 → 可采样的纹理或顶点属性
先用高质量工具表达细节,再把细节烘焙到硬件友好的低模与纹理;艺术家保留创作自由,运行时获得可控成本。

管线可以分成两个艺术阶段和一个自动化阶段:

  1. 艺术家在 DCC 中创建高质量对象和 shader 网络。高模细节、位移、布料纹理或复杂环境不必先服从实时三角形预算。
  2. 艺术家创建与高模大致同形的低模骨架,只负责可动画的拓扑、UV 和实时 shader 所需的最小顶点属性。
  3. 工具用高模与软件 renderer 评估材质,再把结果按低模的参数化写入 normal、diffuse、reflection 等 map,或写入顶点颜色等属性。

最终硬件渲染不再直接看到高模网格,而是看到低模三角形与可采样的 map。这样做的收益不是“让 GPU 计算更多”,而是把昂贵计算提前到资产构建阶段,让运行时只做稳定、可预算的采样和 shading。

2. 几何数据与属性地图的职责

hardware rendering componentsgeometric datatriangles / stripsposition + UVnormal + tangentbinormal basisvertex shader → rasterizerattribute mapsnormal: surface directiondiffuse: surface colorreflection: environmentprocedural / NPR effectspixel shader → final color
硬件管线消费两类输入:三角形和顶点属性负责几何,attribute maps 以纹理密度承载原来难以实时计算的表面细节。

硬件渲染输入有两个互补部分。几何数据包含三角形、位置和顶点属性;attribute maps 则用比几何更高的纹理密度描述表面细节。DCC 可以把多边形转换为三角形,必要时组织成 triangle strip;硬件 vertex shader 处理顶点,rasterizer 生成 fragments,pixel shader 再组合纹理结果。

常见的顶点格式可以压缩成如下接口。这里的 COLOR0 只是存储切线的一种历史约定,不意味着切线必须被当成颜色理解:

struct AppToVertex {
  float4 position : POSITION;
  float4 normal   : NORMAL;
  float4 tangent  : COLOR0;
  float4 uv0      : TEXCOORD0;
  float4 uv1      : TEXCOORD1;
  float4 uv2      : TEXCOORD2;
  float4 uv3      : TEXCOORD3;
};

纹理坐标决定如何在表面采样,也决定了切线生成时的方向。法线、切线和副切线组成一个局部 basis;如果 shader 使用 tangent-space normal map,缺少其中任一份契约都会让光照方向解释错误。

纹理颜色通常用 RGBA 的 0 到 1 范围存储。法线的每个分量原本位于 -1 到 1,需要先缩放并偏移到纹理范围;运行时再还原。漫反射图记录表面颜色,reflection map 记录静态环境的颜色,procedural、environment-based lighting 与非真实感效果也可以在烘焙阶段成为同一套属性输入。

3. UV、法线空间与可复用性

不是贴图完成后的附属数据,而是烘焙算法的采样坐标系。低模 UV 应尽量有连续的 u/v flow、较少的 islands 和清晰的边界;边界越多,texel 越容易在相邻三角形之间产生不一致,切线方向也更容易跳变。

normal map 直接保存物体坐标中的方向,运行时计算相对便宜,但地图通常不能无修改地复用到另一对象。 normal map 需要更多顶点操作,却能随低模表面方向变化,适合平铺、实例化和跨对象复用。

normal bake:先投影,再换基high-resdense detailspass 1high-res normallow-res UV parameterization→ model-space mappass 2sample model-space normallow-res tangent + binormal→ tangent-space map选择空间是一次工程取舍model space:运行时更省但对象专用;tangent space:顶点计算更多但可平铺、可跨对象复用
model-space normal map 是中间证据;加入低模的 tangent basis 后再得到可复用的 tangent-space normal map。

normal map 的两阶段流程是:

  1. 使用低模的 UV 参数化,在高模表面采样法线,并将结果写成 model-space map。低模本身可以暂时透明,以免它的几何遮挡高模细节。
  2. 在低模表面采样这个中间 map,再读取低模的 tangent 和 normal;用叉积得到副切线,构造新的局部参考系,把 model-space normal 变换成 tangent-space normal。

<Term def="由 normal、tangent 和 binormal 构成的局部正交方向框架,用来把模型坐标中的法线转换到 tangent space">tangent basis</Term> 的来源要可追踪:normal 可以来自建模工具,tangent 可以由 UV 算法生成,也应允许艺术家覆盖;binormal 通常由 normal 与 tangent 的叉积得到。若 UV 岛边界处的方向不连续,自动生成结果就可能需要边缘扩散、平均或手工修订。

4. 让软件 renderer 生成属性

可以直接重用成熟的 shader 网络。工具不需要拆解每一个 lighting term,而是通过临时 shader 或可控的 light rig 把想要的中间量编码成颜色,再将 RGBA 结果写入 map 或 vertex color。

4.1 normal 与 tangent 的生成

渲染到纹理时,工具根据目标 UV 找到低模表面上的采样位置,再用软件 renderer 发射射线或评估高模表面;渲染到顶点时,则在每个顶点位置采样。两者都可以生成表面颜色,但 custom software shader 还可以把 normal、tangent 或其他四分量属性编码为颜色。

高模与低模不要求拓扑完全对应,但形状应尽量相近。形状差异越大,投影射线越可能找到错误的表面,最终 map 中的细节就会偏离低模的实际轮廓。生成工具应记录投影距离、命中率和边缘填充,而不是只保存一张看起来正常的最终贴图。

4.2 diffuse map 的中性 light rig

复杂材质网络常常把漫反射、环境、镜面和光照混在一起,工具未必能直接抽出“纯 diffuse”项。一个实用技巧是临时关闭高模的 ambient 与 specular,再关闭场景原灯,安装一个尽量均匀的 light rig。低模保持透明,只让高模细节经过目标 UV 渲染到 map。

即便如此,light rig 仍可能留下阴影或渐变伪影;颜色校正可以修复少量误差,但不能替代正确的光照隔离。发布前应将纯材质对照、烘焙结果和最终硬件渲染并排比较,检查边缘和高曲率区域。

4.3 reflection 与程序效果

当环境是静态的,可以让软件 renderer 生成 cubic 或 spherical reflection map。立方体环境需要从反射物体的视点分别渲染包围立方体的六个面;球形环境则用覆盖可见半球的视场生成。全局光照、final gathering、caustics 或 marble、wood、noise 等程序效果都可以被提前烘焙,但动态环境或动态程序参数会让地图失效,必须重新生成或改用运行时计算。

high-res shader network + controlled light rig
        ↓ software evaluation
RGBA map / vertex color / normal map
        ↓ low-res UV + hardware shader
real-time approximation with bounded cost

5. 用测试案例检查近似质量

high-res source440 meshes · 260k+ trisbakenormal detaildiffuse colorsoftware rendererhardware targetsingle mesh · under 4k trisreflective armor + nonspecular fabrictangent normal map + diffuse map → close hardware approximation
案例的关键不是某个角色数字,而是形状相近、UV 合理的低模如何用两张纹理承载高模的材质和几何细节。

官方案例使用约 440 个高模网格、超过 260,000 个三角形的角色源资产,以及不到 4,000 个三角形的单一低模。armor 使用带反射的 bump 效果,fabric 使用没有镜面项的 bump 效果;低模依靠 tangent-space normal map 与 diffuse map 还原高模的视觉细节。

这个案例展示了三个可迁移的判断:

  • 形状:低模不必复制高模拓扑,但轮廓和主要曲面要相近,否则投影误差会直接写入 map。
  • UV:低模 UV 应尽量不重叠、少断裂,并充分利用贴图空间;UV 岛边的 sampling discontinuity 是常见伪影来源。
  • 证据:同时保留高模软件渲染、低模硬件渲染、model-space 中间 normal map、tangent-space 最终 map 和差异图。

software → hardware baking lab

让高质量输入成为可回归的资产

这是一个关系实验:高模细节越多,烘焙越贵;UV、形状差异和 map 分辨率决定误差;model/tangent space 则交换运行时成本与复用能力。数值为示意,不代替真实 renderer 对照。

high-res → bake → low-res GPUhigh-res260k trisbakeautomatedGPUtangent mapcost / quality model(示意)烘焙 4.7 · 运行时 1.2 · UV 0.82map 1024px · 形状/采样风险 0.26可跨对象复用 · 静态环境可烘焙条件良好:可把软件 renderer 的细节压到硬件输入,并用对照图复核。

条件良好:可把软件 renderer 的细节压到硬件输入,并用对照图复核。

交互实验把这些关系压缩成可调变量。切换 model/tangent space 会交换运行时成本与跨对象复用能力;降低 UV 质量会提高投影和切线风险;增加高模规模与 map 分辨率会提高烘焙成本;动态环境则让静态 reflection map 不再可靠。实验数值仅用于建立因果关系,真正的发布判断仍需要目标 renderer 的 frame time、显存和画面对照。

6. 自动化与迭代边界

这一流程的目标不是把技术细节转嫁给艺术家,而是让工具自动化,同时保留可解释的输入。一个可重复的 bake manifest 至少应包含:

  • 高模和低模的版本、单位、坐标空间与投影设置;
  • UV 集合、岛边界策略、边缘 padding 和 map 分辨率;
  • normal space、tangent 生成器、是否允许手工 tangent override;
  • 软件 renderer、shader 网络、临时 light rig 与材质开关;
  • 生成的 map、烘焙耗时、错误/警告、对照图和最终硬件 profile。

自动化并不意味着每个 map 都必须每次重建。静态环境可以缓存,未变化的高模和材质可以复用中间结果;但只要 UV、形状、shader 参数或 renderer 版本变化,就应让缓存键失效。这样的依赖图比“艺术家记得点 Bake”更可靠,也更容易在 CI 中做视觉回归。

性能上要把烘焙时间和运行时成本分开:软件 renderer 的慢是资产构建阶段的成本,硬件 shader 的快才是用户交互阶段的收益。若迭代过程需要数小时才能重新烘焙,工具仍然会成为瓶颈;章节结论也明确指出,渲染速度和 surface map 的 shading artifact 仍需要进一步改进。

小结

  • 高质量软件 renderer 已经拥有成熟的材质、几何和光照能力,适合在资产构建阶段生成实时硬件需要的输入。
  • 高模负责表达自由,低模负责运行时预算,attribute maps 和顶点属性负责把细节从前者传给后者。
  • UV parameterization 决定 texel 如何落在表面,也影响 tangent basis、边界连续性和投影误差。
  • model-space normal map 运行时更省但对象专用;tangent-space normal map 多一些顶点工作,却能复用和实例化。
  • normal map 需要先生成 model-space 中间结果,再结合低模的 normal、tangent 和 binormal 换到 tangent space。
  • diffuse、reflection 和程序效果可以通过软件 renderer、临时 shader 与 light rig 烘焙,但动态输入必须重新生成或保留运行时计算。
  • 发布判断要同时看 UV、形状差异、map 分辨率、烘焙时间、运行时 frame time、显存和差异图,而不是只看最终截图。

练习

问题 1|空间选择 请比较 model-space normal map 与 tangent-space normal map 的运行时成本、对象复用能力和适用场景,并说明为什么 tangent-space 需要 tangent basis。

问题 2|烘焙失败诊断 低模的 normal map 在 UV 岛边出现接缝。请列出至少三个排查项,并说明如何区分 UV 问题与高低模形状差异问题。

问题 3|内容管线设计 请设计一份 bake manifest,使团队可以在 shader 或 UV 修改后稳定地重建 diffuse、normal 和 reflection maps,并能判断结果是否值得发布。

名词解释

本章出现的专业名词,用大白话再讲一遍。

attribute map
由软件 renderer 生成、供硬件 rasterizer 和 pixel shader 采样的纹理或顶点属性。
UV parameterization
把表面三角形映射到纹理平面的坐标参数化,决定 texel 投影与切线方向。
model space
以物体自身坐标表达法线方向的 normal map 空间。
tangent space
以每个顶点的法线、切线和副切线为局部坐标系表达法线的 normal map 空间。
tangent basis
由 normal、tangent 和 binormal 构成的局部方向框架,用于坐标空间变换。
software renderer
在资产构建阶段执行高质量材质、几何与光照计算的离线渲染器。

资料与写作方式声明

本章以GPU Gems 系列权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…