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. 从高质量内容到硬件输入
↡由软件 renderer 生成、供硬件 rasterizer 和 pixel shader 采样的纹理或顶点属性,用来承载高模和复杂材质的细节 是这条管线的核心产物。它把原本只能在高模或复杂 shader 中得到的颜色、法线、反射环境和程序纹理,转成低模运行时可以读取的输入。
管线可以分成两个艺术阶段和一个自动化阶段:
- 艺术家在 DCC 中创建高质量对象和 shader 网络。高模细节、位移、布料纹理或复杂环境不必先服从实时三角形预算。
- 艺术家创建与高模大致同形的低模骨架,只负责可动画的拓扑、UV 和实时 shader 所需的最小顶点属性。
- 工具用高模与软件 renderer 评估材质,再把结果按低模的参数化写入 normal、diffuse、reflection 等 map,或写入顶点颜色等属性。
最终硬件渲染不再直接看到高模网格,而是看到低模三角形与可采样的 map。这样做的收益不是“让 GPU 计算更多”,而是把昂贵计算提前到资产构建阶段,让运行时只做稳定、可预算的采样和 shading。
2. 几何数据与属性地图的职责
硬件渲染输入有两个互补部分。几何数据包含三角形、位置和顶点属性;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 流、岛数量、重叠与边界连续性 不是贴图完成后的附属数据,而是烘焙算法的采样坐标系。低模 UV 应尽量有连续的 u/v flow、较少的 islands 和清晰的边界;边界越多,texel 越容易在相邻三角形之间产生不一致,切线方向也更容易跳变。
↡以物体自身坐标表达法线方向的 normal map 空间;运行时变换较少但通常与单个对象绑定 normal map 直接保存物体坐标中的方向,运行时计算相对便宜,但地图通常不能无修改地复用到另一对象。↡以每个顶点的法线、切线和副切线为局部坐标系表达法线的 normal map 空间 normal map 需要更多顶点操作,却能随低模表面方向变化,适合平铺、实例化和跨对象复用。
normal map 的两阶段流程是:
- 使用低模的 UV 参数化,在高模表面采样法线,并将结果写成 model-space map。低模本身可以暂时透明,以免它的几何遮挡高模细节。
- 在低模表面采样这个中间 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 cost5. 用测试案例检查近似质量
官方案例使用约 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 对照。
条件良好:可把软件 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
- 在资产构建阶段执行高质量材质、几何与光照计算的离线渲染器。