法线贴图与凹凸贴图
Normal & Bump Mapping
凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。
三种细节尺度
| 尺度 | 大小 | 表示方式 | 例子 |
|---|---|---|---|
| 宏观 | 覆盖许多像素 | 顶点与三角形 | 角色的四肢和头 |
| 中观 | 几个像素 | 凹凸贴图类技术 | 脸上的皱纹、肌肉细节、衣服褶皱和接缝 |
| 微观 | 远小于像素 | 着色模型(及其参数纹理) | 光滑物体在微观上平滑,漫反射表面在微观上粗糙 |
尺度划分是流动的,同一物体可能在不同距离被观察。常见流程:美术把细节雕刻到模型上,再用软件转换成凹凸纹理(可能还有缝隙变暗纹理)。
切线空间 (TBN)
- 每个顶点存切线框架:法线 、切线 、副切线 (也被误称为 binormal)。、 是法线贴图本身的轴在物体空间中的方向。以它们为行的 TBN 矩阵把光的方向从世界空间变到切线空间。
- 三者不必严格正交,但非正交会使纹理倾斜、可能需要更多存储,且不能用转置求逆。
- 省内存:只存 、,叉积求 ——仅当手性始终相同时可行。对称模型常镜像复用纹理,两侧手性不同,此时每顶点多存 1 位手性标志,用来对叉积取反。
- 切线框架正交时可存成四元数,更省空间并省一些逐像素计算,质量损失实际很少见。
- 切线框架也用于定义材质在表面上的朝向,例如拉丝铝、天鹅绒。
- 也有在像素着色器中即时计算切线框架、或用位置导数和高度场导数直接求扰动法线的方法,无需预存;但可能显示的细节明显更少,还可能带来美术流程问题。
Blinn 的方法(1978)
- 偏移向量凹凸贴图:每纹素存两个有符号值 、,缩放两个垂直于法线的向量后加到法线上。
- 高度场:单色纹理表示高度;相邻列之差得 u 方向斜率、相邻行之差得 v 方向斜率,或用 Sobel 滤波器。
法线贴图
- 与 Blinn 方法数学上相同,只是存储格式和着色器计算不同。8 位纹理中 0 表示 −1、255 表示 1;平坦法线 (0, 0, 1) 对应浅蓝色 [128, 128, 255]。
- 世界空间法线贴图最早提出但很少用;物体空间允许模型旋转。两者都把纹理绑定到特定几何和朝向,限制复用。
- 切线空间法线贴图最常用:允许表面变形、最大限度复用,且 z 通常为正,便于压缩(见纹理压缩)。
- 从高度图求法线:,,未归一化法线 ;注意纹理边界。
法线贴图的过滤
- 法线与着色颜色一般非线性,标准过滤可能导致明显混叠。书中例子:光亮白色大理石台阶的顶面或侧面在某些角度反射高光,但平均法线约 45°,会从完全不同的方向接收高光。锐利高光的凹凸贴图若不正确过滤,会出现随采样位置忽明忽暗的闪烁。
- Lambert 表面是特例:点积是线性运算,平均法线(不归一化)再点积等于逐个点积再平均,所以标准过滤和 mipmap 近似正确;只因实际是 ,掠射光下会过暗,实践中通常可接受。但从 x、y 重建 z 的压缩方法不支持非单位长度法线。
- 非 Lambert 表面应把着色方程输入作为一组过滤(9.13 节)。
地平线贴图
预计算额外纹理,存每个纹素在若干表面方向上的地平线角度,让凹凸在自身表面投下阴影(11.4 节)。
GEA 的视角:凹凸贴图已让位于法线贴图(卷 II 11.3.14.1、11.6.2)
- GEA 把凹凸贴图描述为用高度图廉价生成表面法线的技术,主要用于 3D 图形的早期;如今多数游戏引擎直接在法线贴图中显式存法线,而不是从高度图计算(卷 II 11.6.2)。法线贴图把单位法线编码成 RGB 存在每个纹素上(卷 II 11.3.14.1)。
- 计算所需的切线空间由顶点的法线、切线、副切线构成,见 顶点着色器 中的 GEA 部分;视差与置换贴图见 视差贴图 中的 GEA 部分。
PBRT 的视角:离线渲染器中的法线贴图与凹凸贴图(PBRT 4e 10.5.3–10.5.4)
法线贴图
- 采用切线空间(与第 9 章的反射坐标系相同: 对齐法线),同一张图可复用于不同形状;RGB 存 ,所以切线空间法线贴图大多偏蓝。8 位定点值从 映射回 后必须重新归一化(量化和双线性插值都会破坏单位长度)。
- 光谱渲染的副作用:pbrt 的
SpectrumTexture返回点采样光谱而非 RGB,从光谱恢复 RGB 需要蒙特卡洛估计,会给法线带来噪声;法线误差是系统性偏差(光泽表面上会射向完全错误的物体),不可接受。所以NormalMap()直接读Image,代价是不能用缩放、混合和各种纹理映射。环绕模式固定为 Repeat, 同样翻转。 - 输出的不是法线本身,而是与新着色法线一致的 、:先对原 做 Gram–Schmidt 得到与 垂直的最近向量,再用 得 ,两者缩放回原长度。
凹凸贴图
位移面 ,
- 用前向差分 ,这样不必给
FloatTexture接口加导数,程序纹理也能用; 取约半个像素样本间距(太小浮点精度不够,太大丢细节)。 - 多数实现丢掉 项(假设 很小,而且许多渲染器根本不计算 ),后果是位移整体加常数不影响结果;pbrt 三项都算,但实践中这一项很少有可见差别。
与上文(RTR4、GEA)的对照
| 话题 | RTR4 / GEA(上文) | PBRT 4e |
|---|---|---|
| 地位 | GEA:凹凸贴图已让位于法线贴图 | 两者并存;凹凸贴图因为能用任意程序纹理而常用 |
| 法线来源 | 纹理采样单元直接取 RGB | 光谱管线下只能读 Image,绕开纹理系统 |
| 项 | Blinn 方法通常忽略 | 保留 |
| 自阴影、过滤 | 地平线贴图、法线贴图过滤 | 延伸阅读:Max 1988 地平线贴图;明暗交界线问题(Conty Estevez 等 2019、Chiang 等 2019);LEAN(Olano–Baker 2010)、把位移转成 Beckmann 分布(Dupuy 等 2013、Hery 等 2014)、Kaplanyan 2016、Tokuyoshi–Kaplanyan 2019 |
原书问题(10.5.3)
正文说" 由 与新的 的叉积得到",自相矛盾;应为 与 Gram–Schmidt 后的新 的叉积(措辞问题)。
原书问题(第 10 章参考文献)
- Logie 与 Patterson "Inverse displacement mapping in the general case" 在书中标为 1994 年、Computer Graphics Forum 14(5), 261–73(延伸阅读正文也写 "Logie and Patterson 1994")。Crossref 记录(DOI 10.1111/1467-8659.1450261)为 CGF 14(5), 261–273,1995 年 12 月:卷期页码正确,年份应为 1995。(本页旧版据年份推断"应为 13(5)",已核实撤回。)
LearnOpenGL 的视角:切线空间法线贴图与 TBN / Gram-Schmidt(Advanced Lighting / Normal Mapping)
法线贴图把法线存成 RGB(先 n*0.5+0.5);采样后 normalize(rgb*2-1)。贴图多为蓝调(+Z)。仅当表面也朝 +Z 时才能直接用世界/模型法线;任意朝向需 切线空间。
由三角形两边与 ΔUV 解 T、B(矩阵形式);与 N 组成 TBN。两种用法:(1) TBN * tangentNormal 变到世界再光照;(2) 把 light/view/frag 变到切线空间(可用正交矩阵转置代替求逆),常把变换放在 VS 以省 FS。Assimp:aiProcess_CalcTangentSpace;.obj 上法线图有时在 aiTextureType_HEIGHT。
共享顶点平均切线会破坏正交性 → Gram-Schmidt 让 T 对 N 再正交,再 B=cross(N,T)。OpenGL UV 常翻转,网上法线贴图绿通道可能已按引擎约定反转。低模+法线可接近高模细节(性能理由)。
GPU Gems 的视角:GPU 上烘焙法线贴图(GPU Gems 3 第 22 章)
来源:Diogo Teixeira《Baking Normal Maps on the GPU》;摘录 Chapter 22. Baking Normal Maps on the GPU — Diogo Teixeira。工具链视角:把 CPU 烘焙器搬到中端 SM3 显卡。
低模在 UV 空间光栅化,从边界笼沿射线射向高模;均匀网格 + 3D-DDA 遍历;取离笼最近命中,变到切线空间写入。高模无需 UV。数据:3D 网格纹理、三角形列表、顶点/法线纹理。SM3 单循环上限 256 → 嵌套循环或分块多遍。抗锯齿可用多射线或抖动多遍累加。作者测得烘焙快于当时 Melody / xNormal。同类管线可扩到位移图、腔体 AO。提示:背景用中蓝而非纯黑,减轻 mip 问题。
出处
- realtime_rendering_4ed.pdf 第 6 章 Texturing
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.14.1、11.6.2 节
- PBRT 4e source excerpt: chapter 10 (Textures and Materials)
- Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 10 章 10.1–10.5 节,pbr-book.org/4ed/Textures_and_Materials
- Chapter 22. Baking Normal Maps on the GPU — Diogo Teixeira
- developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-22-baking-normal-maps-gpu
- Advanced Lighting — Normal Mapping
- learnopengl.com/Advanced-Lighting/Normal-Mapping