中EN
概念页

法线贴图与凹凸贴图

Normal & Bump Mapping

更新于 2026-10-15 约 11 分钟纹理法线贴图凹凸贴图切线空间PBRT

凹凸贴图是一类在像素着色中修改着色法线来表现中尺度细节的技术:几何法线不变,只改变光照计算使用的法线,从而在不增加几何的情况下显得更立体。最常用的形式是切线空间法线贴图,需要每顶点的切线框架;法线贴图的过滤是难点。

三种细节尺度

尺度大小表示方式例子
宏观覆盖许多像素顶点与三角形角色的四肢和头
中观几个像素凹凸贴图类技术脸上的皱纹、肌肉细节、衣服褶皱和接缝
微观远小于像素着色模型(及其参数纹理)光滑物体在微观上平滑,漫反射表面在微观上粗糙

尺度划分是流动的,同一物体可能在不同距离被观察。常见流程:美术把细节雕刻到模型上,再用软件转换成凹凸纹理(可能还有缝隙变暗纹理)。

切线空间 (TBN)

  • 每个顶点存切线框架:法线 n\mathbf{n}、切线 t\mathbf{t}、副切线 b\mathbf{b}(也被误称为 binormal)。t\mathbf{t}、b\mathbf{b} 是法线贴图本身的轴在物体空间中的方向。以它们为行的 TBN 矩阵把光的方向从世界空间变到切线空间。
  • 三者不必严格正交,但非正交会使纹理倾斜、可能需要更多存储,且不能用转置求逆。
  • 省内存:只存 t\mathbf{t}、b\mathbf{b},叉积求 n\mathbf{n}——仅当手性始终相同时可行。对称模型常镜像复用纹理,两侧手性不同,此时每顶点多存 1 位手性标志,用来对叉积取反。
  • 切线框架正交时可存成四元数,更省空间并省一些逐像素计算,质量损失实际很少见。
  • 切线框架也用于定义材质在表面上的朝向,例如拉丝铝、天鹅绒。
  • 也有在像素着色器中即时计算切线框架、或用位置导数和高度场导数直接求扰动法线的方法,无需预存;但可能显示的细节明显更少,还可能带来美术流程问题。

Blinn 的方法(1978)

  • 偏移向量凹凸贴图:每纹素存两个有符号值 bub_u、bvb_v,缩放两个垂直于法线的向量后加到法线上。
  • 高度场:单色纹理表示高度;相邻列之差得 u 方向斜率、相邻行之差得 v 方向斜率,或用 Sobel 滤波器。

法线贴图

  • 与 Blinn 方法数学上相同,只是存储格式和着色器计算不同。8 位纹理中 0 表示 −1、255 表示 1;平坦法线 (0, 0, 1) 对应浅蓝色 [128, 128, 255]。
  • 世界空间法线贴图最早提出但很少用;物体空间允许模型旋转。两者都把纹理绑定到特定几何和朝向,限制复用。
  • 切线空间法线贴图最常用:允许表面变形、最大限度复用,且 z 通常为正,便于压缩(见纹理压缩)。
  • 从高度图求法线:hx=h(x+1,y)−h(x−1,y)2h_x=\frac{h(x+1,y)-h(x-1,y)}{2},hy=h(x,y+1)−h(x,y−1)2h_y=\frac{h(x,y+1)-h(x,y-1)}{2},未归一化法线 (−hx,−hy,1)(-h_x,-h_y,1);注意纹理边界。

法线贴图的过滤

  • 法线与着色颜色一般非线性,标准过滤可能导致明显混叠。书中例子:光亮白色大理石台阶的顶面或侧面在某些角度反射高光,但平均法线约 45°,会从完全不同的方向接收高光。锐利高光的凹凸贴图若不正确过滤,会出现随采样位置忽明忽暗的闪烁。
  • Lambert 表面是特例:点积是线性运算,平均法线(不归一化)再点积等于逐个点积再平均,所以标准过滤和 mipmap 近似正确;只因实际是 max⁡(l⋅n,0)\max(\mathbf{l}\cdot\mathbf{n},0),掠射光下会过暗,实践中通常可接受。但从 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 章的反射坐标系相同:zz 对齐法线),同一张图可复用于不同形状;RGB 存 xyzxyz,所以切线空间法线贴图大多偏蓝。8 位定点值从 [0,1][0,1] 映射回 [−1,1][-1,1] 后必须重新归一化(量化和双线性插值都会破坏单位长度)。
  • 光谱渲染的副作用:pbrt 的 SpectrumTexture 返回点采样光谱而非 RGB,从光谱恢复 RGB 需要蒙特卡洛估计,会给法线带来噪声;法线误差是系统性偏差(光泽表面上会射向完全错误的物体),不可接受。所以 NormalMap() 直接读 Image,代价是不能用缩放、混合和各种纹理映射。环绕模式固定为 Repeat,vv 同样翻转。
  • 输出的不是法线本身,而是与新着色法线一致的 ∂p/∂u\partial p/\partial u、∂p/∂v\partial p/\partial v:先对原 ∂p/∂u\partial p/\partial u 做 Gram–Schmidt 得到与 nsn_s 垂直的最近向量,再用 ns×∂p/∂un_s\times\partial p/\partial u 得 ∂p/∂v\partial p/\partial v,两者缩放回原长度。

凹凸贴图

位移面 p′(u,v)=p(u,v)+d(u,v) n(u,v)p'(u,v)=p(u,v)+d(u,v)\,n(u,v), ∂p′∂u=∂p∂u+∂d∂un+d ∂n∂u(式 10.12)\frac{\partial p'}{\partial u}=\frac{\partial p}{\partial u}+\frac{\partial d}{\partial u}n+d\,\frac{\partial n}{\partial u}\quad(\text{式 10.12})

  • ∂d/∂u\partial d/\partial u 用前向差分 (d(u+Δu,v)−d(u,v))/Δu\big(d(u+\Delta_u,v)-d(u,v)\big)/\Delta_u,这样不必给 FloatTexture 接口加导数,程序纹理也能用;Δu\Delta_u 取约半个像素样本间距(太小浮点精度不够,太大丢细节)。
  • 多数实现丢掉 d ∂n/∂ud\,\partial n/\partial u 项(假设 dd 很小,而且许多渲染器根本不计算 ∂n/∂u\partial n/\partial u),后果是位移整体加常数不影响结果;pbrt 三项都算,但实践中这一项很少有可见差别。

与上文(RTR4、GEA)的对照

话题RTR4 / GEA(上文)PBRT 4e
地位GEA:凹凸贴图已让位于法线贴图两者并存;凹凸贴图因为能用任意程序纹理而常用
法线来源纹理采样单元直接取 RGB光谱管线下只能读 Image,绕开纹理系统
d ∂n/∂ud\,\partial n/\partial u 项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)

正文说"∂p/∂v\partial p/\partial v 由 nsn_s 与新的 ∂p/∂v\partial p/\partial v 的叉积得到",自相矛盾;应为 nsn_s 与 Gram–Schmidt 后的新 ∂p/∂u\partial p/\partial u 的叉积(措辞问题)。

原书问题(第 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)

来源:Normal Mapping;摘录 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 问题。

  1. realtime_rendering_4ed.pdf 第 6 章 Texturing
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.14.1、11.6.2 节
  4. PBRT 4e source excerpt: chapter 10 (Textures and Materials)
  5. 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
  6. Chapter 22. Baking Normal Maps on the GPU — Diogo Teixeira
  7. developer.nvidia.com/gpugems/gpugems3/part-iv-image-effects/chapter-22-baking-normal-maps-gpu
  8. Advanced Lighting — Normal Mapping
  9. learnopengl.com/Advanced-Lighting/Normal-Mapping

相关页面

图形学视差贴图Parallax Mapping法线贴图的凹凸不会随视角移位,也不会互相遮挡。视差贴图用高度场按视角偏移纹理坐标,以几条额外指令换来明显提升;视差遮蔽贴图 (POM,又称浮雕贴图) 沿视线在高度场中步进求交,能表现遮挡和自阴影,但轮廓仍是原始平面。图形学纹理压缩Texture Compression固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。图形学纹理映射管线Texturing Pipeline纹理通过修改着色方程中使用的值(颜色、粗糙度、法线等)来高效表现表面材质的变化。通用纹理管线是:空间位置 → 投影函数得到纹理坐标 → 对应函数变换到纹理空间 → 取值 → 值变换 → 用于着色。本页还整理纹理坐标约定、纹理表示方式、程序纹理、纹理动画、材质贴图、alpha 贴图和纹理光源。游戏数学基本仿射变换Basic Affine Transforms平移、旋转、缩放、切变是摆放和变形物体的基础矩阵;它们的连乘顺序有关、但满足结合律。刚体变换的逆可以直接写出,法线要用伴随矩阵的转置(传统说法是逆转置)变换。理解这些矩阵的性质能写出更快、更正确的变换代码。游戏数学四元数Quaternion单位四元数可以紧凑地表示任意三维旋转,与轴-角表示互相转换很简单,并能做稳定、匀速的朝向插值(slerp),这些都是欧拉角做不好的。它可以高效地转换为矩阵以便与其他变换合并。图形学基于物理的着色Physically Based Shading基于物理的着色从光与物质交互的物理出发,用 BRDF 和反射方程计算表面沿视线方向射出的辐射亮度:镜面项来自微表面理论与菲涅耳反射,漫反射项来自局部次表面散射,布料、波动光学与分层材质再作扩展。本页是 RTR4 第 9 章的总览,并收录该章第 9.13 节的材质混合与材质过滤(镜面抗锯齿)。图形学微表面理论Microfacet Theory微表面理论把小于像素的微几何建模为大量平坦微面元,用法线分布函数 (NDF) D(\mathbf{m}) 描述其朝向统计,用遮蔽函数 G1 和遮蔽-阴影函数 G2 描述可见性,并据此推导宏观 BRDF。镜面反射时每个微面元是完美菲涅耳镜,积分退化为在半向量处求值,得到 FG2D/(4|\mathbf{n}\cdot\mathbf{l}||\mathbf{n}\cdot\mathbf{v}|)。GGX 分布配合高度相关的 Smith G2 是当今影视和游戏最常用的组合;该框架忽略微面元间的多次反射,可用补偿项弥补。本页对应 RTR4 9.6–9.8 节。图形学网格简化Mesh Simplification网格简化(数据缩减、抽取 decimation)在尽量保持外观的前提下减少三角形数,使应用能在低端机器上伸缩。核心操作是可逆的边折叠,用代价函数(典型是 Garland–Heckbert 的二次误差度量 QEM)排序;它产生的渐进网格可用于连续 LOD 与渐进传输,但自动化并非万能。图形学细分曲线与细分曲面Subdivision Curves & Surfaces细分从一个控制多边形 / 控制网格出发,反复"细化 + 平滑",极限是光滑的曲线或曲面。它能从任意拓扑的网格得到连续、无裂缝的曲面,规则简单、天然支持无限 LOD,连接了离散三角网格与连续曲面。游戏和电影最常用的是 Catmull-Clark(四边形)和 Loop(三角形)两种逼近型方案,可扩展出折痕和置换细分。图形学贴花渲染Decal Rendering贴花 (decal) 是叠加在表面上的图案或纹理,如轮胎印、弹孔、玩家喷漆、标志。贴花可只改颜色(纹身)、只改凹凸(压印标志)或换成完全不同的材质(车窗贴纸),可多个叠在同一几何上,也可横跨多个模型。主流做法是用有向盒做正交投影的投影贴花;延迟着色把贴花效果直接写进 G-buffer,分簇前向着色则把贴花像光源一样放进簇列表。图形学VR 渲染注意事项VR Rendering Considerations在单屏上效果良好的渲染技术,放到随头部移动的双目显示上可能失效甚至引起不适。本页汇总 RTR4 第 21.4 节列出的需要修改或避免的技术:HUD 深度、凹凸与视差贴图、公告板与天空盒、色调映射与屏幕空间效果、镜面高光视差、抗锯齿选择、色带、运动模糊与景深,以及混合现实中的光照匹配。核心原则:严格遵循厂商头部模型和投影矩阵,任何会让两眼图像难以融合或与前庭感觉冲突的效果都要谨慎。图形学球面函数基Spherical Basis Functions要让环境光照超越常数项,需要表示"每个入射方向的辐亮度"这样的球面函数。把函数转成某种表示叫投影,从表示求值叫重建。本页对比表格形式、环境立方体、球面高斯、球谐函数,以及专门为半球设计的 AHD、Half-Life 2 基和 H-basis。综合角色渲染Character Rendering角色是游戏中最受关注、技术最集中的资产。本页按"动起来 → 表面细节 → 材质着色 → 特殊材质(皮肤、毛发、布料)→ 光照与阴影 → 性能"的顺序,把 wiki 中相关概念页串成一套角色渲染方案的地图。每一层只给出要点与取舍,细节见链接页。图形学预计算光照与光照贴图Precomputed Lighting & Light Maps烘焙 (baking) 是把辐射度或路径追踪等离线 GI 结果预先算好存起来,运行时直接查询。静态几何参与预计算并完整交互,动态物体只作接收者。数据可以是辐照度,也可以带方向(SH、H 基、AHD、球面高斯、环境立方体等),存储在光照贴图、顶点或体积/探针中,各有接缝、漏光、内存等取舍(RTR4 11.5.1、11.5.2、11.5.4 节)。图形学顶点压缩与精度Vertex Compression & Precision网格数据像纹理一样可以压缩:传输用的整体压缩(Draco 等)一次性解码,渲染用的定长压缩让顶点着色器在 GPU 上逐顶点解码,从而降低内存、带宽并改善缓存。另一面是精度问题:大世界中单一坐标系会让远离原点的物体抖动,需要相对相机的变换或分段原点。图形学环境贴图Environment Mapping把球面函数记录在一张或多张图像里、用纹理查找来解码,就是环境贴图。它比其他球面表示占内存多,但解码简单快速,能表达任意高频和任意动态范围。最基本的用法是反射贴图:假设镜面 BRDF,用反射视线向量查表。本页比较经纬度、球面、立方体、双抛物面和八面体等投影。游戏开发 · UE5移动端渲染优化Mobile Rendering Optimization移动端优化的核心是认清设备的 CPU/GPU 速度、线程、带宽和内存,然后控制最主要的几项开销:Draw Call(官方称其为当前导致图形性能低下的最大因素,在 Galaxy Tab S6 上建议约 700 个,低端设备少于 500 个)、材质复杂度和 overdraw。合并网格和材质(Substance 把多种材质画进同一张纹理,用顶点色作遮罩)是减少 Draw Call 最直接的办法。图形学顶点着色器Vertex Shader顶点着色器是程序员直接控制的第一个管线阶段,逐个处理输入顶点,至少要输出顶点在齐次裁剪空间里的位置。它不能创建或删除顶点,顶点之间也不能传递结果,正因如此可以大规模并行。游戏美术法线与 AO 贴图制作要点Normal & AO Map Authoring Tips《The PBR Guide》把 Ambient Occlusion、Height、Normal 列为 MR/SG 共用通道。本页只收录面向美术的制作要点;法线数学与 AO 算法见图形学专页。游戏美术金属度与粗糙度贴图Metallic & Roughness MapsMetallic 是告诉着色器「Base Color 这段是电介质固有色还是金属 F0」的掩码;Roughness 描述微观不规则、控制高光扩散。生产上金属度宜接近二值,粗糙度几乎全由美术叙事;并记住 \mathrm{roughness}=1-\mathrm{glossiness}。

被这些页面引用2 篇

输入关键词开始搜索

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