凹凸贴图是计算机图形学中一种通过在着色阶段扰动表面法线来模拟凹凸细节的渲染技术,它不改变模型的几何形状,也不增加多边形数量。其做法是在计算光照前,为每个像素附加一个取自高度图或法线图的法线扰动,使表面看起来更丰富、更接近自然物体的外观。该技术由吉姆·布林(Jim Blinn)在 1978 年提出[1],因计算开销低而成为实时三维图形的常用手段。
定义
凹凸贴图是一种纹理映射技术,渲染时先为每个待渲染的像素加上一个取自高度图的扰动,再进入照明计算。其中的凹凸图(bump map)可理解为描述表面起伏的标量高度数组,记录平坦表面与理想凹凸表面沿法线方向的差值,通常由绘制程序或图像处理工具生成[2]。这项技术也被称为凸凹纹理映射或皱面贴图。
法线贴图是凹凸贴图最常见的实现方式,除此之外还有视差映射等做法。两者的目标一致,区别在于数据的组织方式:高度图用单通道灰度值表示高低,法线贴图则把单位法线向量的分量直接编码进颜色通道[3]。
原理
凹凸贴图的基本判断是:表面起伏对观感的影响主要来自法线方向的改变,而非表面位置本身的移动,因此只需在着色阶段扰动法线就能得到相近效果,不必细分几何[2]。设曲面参数为 (u,v)、高度函数为 h(u,v),在局部坐标系中扰动法线可近似表示为 $n' = (h_u, h_v, 1)$,其中 $h_u$、$h_v$ 是高度对两个参数的偏导数[4]。
若以表面法线 N、切线 T 和副法线 B 构成局部坐标系,扰动后的法线可写成 $N' = N + b_u T + b_v B$,其中 $b_u$、$b_v$ 由高度场的有限差分求得[4]。这一近似成立的条件是高度起伏远小于表面的曲率半径,此时得到的扰动法线尚未归一化[4]。
整个计算过程可以概括为以下流程:
flowchart LR
A[高度图或凹凸图] --> B[求高度偏导数]
B --> C[合成法线扰动]
C --> D[逐像素光照计算]
D --> E[呈现凹凸明暗细节]
使用法线贴图时,渲染器不再在运行时求导,而是直接读取贴图中已编码的法线,把它与光照方向做点乘,得到逐像素的明暗结果[3]。为便于在不同模型与朝向下复用,这类法线通常记录在切线空间中,该空间由法线、切线与副切线三个轴向构成[4]。
发展历程
1978 年,吉姆·布林在 SIGGRAPH 会议上发表论文《Simulation of Wrinkled Surfaces》,提出在计算光强之前用纹理函数对表面法线方向作小幅扰动,从而不必把每条皱纹建成单独的面片,也能得到逼真的表面起伏[1][5]。该文提到,1973 年埃德温·卡特穆尔(Ed Catmull)曾提出用参数曲面的参数值索引纹理定义函数来缩放反射光强度,但以这种方式模拟粗糙表面并不令人信服[1]。
在硬件层面,GeForce 2 一类图形加速设备曾采用计算量更小的假凹凸贴图,用纹素索引的变化代替曲面法线的变化。2000 年 DirectX 8 发布后,图形处理器转向可编程着色器架构,基于法线贴图的凹凸映射随之普及[6]。2004 年,《光环 2》与《毁灭战士 3》等游戏开始使用高光贴图与法线贴图,此后这类贴图逐渐成为游戏模型的常规配置[7]。
1998 年出现了把高细节模型的表面信息通过法线贴图迁移到低面数模型的论文,其中一种做法把高面数网格与低面数网格解耦,使细节的还原不依赖低模的生成方式,这一思路至今仍被多数工具沿用[8]。在同一思路基础上,后续又发展出视差映射与置换贴图等技术[9]。
应用
凹凸贴图主要面向实时三维图形,尤其是电子游戏,用于在不增加多边形的前提下为低面数模型补上凹痕、缝隙与划痕等细节[7]。常见流程是先建立高精度模型,把细节烘焙成法线贴图,再贴到同一物体的低精度版本上,从而在有限的渲染预算内保留观感[7]。
由于开销较低,该技术适合表现具有规律性粗糙度的表面,橘子、草莓、灰泥和木材都是常被举出的例子[10]。除游戏之外,这类方法也被用于陶瓷产品的造型设计,以表现表面的凹凸与雕刻效果[11]。
在凹凸贴图之后,视差映射等方法进一步利用高度与视角偏移纹理坐标,让平整表面在视角移动时产生更明显的深度错觉[3]。
局限
凹凸贴图只改变用于着色的法线,不改变几何位置,因此不影响物体轮廓,也不能产生真正的自遮挡与自阴影:来自凹凸的阴影以及落在凹凸上的阴影仍按平坦表面处理[2]。由于细节并非真实几何,被贴图覆盖的模型剪影也不会随之改变[12]。
这种凹凸依赖光照形成的错觉,只有在视角与距离合适时才不易被察觉,视线与表面接近平行时容易露出破绽[6]。为缓解由此产生的偏差,视差映射等方法会用高度与视角改写纹理坐标,使平整表面表现出深度[3]。
与置换贴图相比,凹凸贴图无法生成真实的几何起伏,因而没有轮廓变化,也难以得到正确的自阴影[12][9]。置换贴图则要求把网格细分或镶嵌到足够密,并按高度移动顶点位置,计算代价明显更高[4]。
参见
参考资料
- acm.org 上的网页 . acm.org [引用日期2026-09-29]
- node138 . opengl.org [引用日期2026-09-29]
- 纹理节点 . microsoft.com [引用日期2026-09-29]
- Hierarchy of scales . cornell.edu [引用日期2026-09-29]
- Simulation of wrinkled surfaces . caltech.edu [引用日期2026-09-29]
- 3Dグラフィックス・マニアックス(14) 微細凹凸表現の基本形「法線マップ」(1) - 速報やレビュー、PCと技術の全て . mynavi.jp [引用日期2026-09-29]
- texturing-video-games . foundry.com [引用日期2026-09-29]
- Normal mapping . wikipedia.org [引用日期2026-09-29]
- 位移贴图 . wikipedia.org [引用日期2026-09-29]
- node107 . opengl.org [引用日期2026-09-29]
- Ceramic Product Design Based on Bump Texture Mapping . ieee.org [引用日期2026-09-29]
- Difference between Normal Bump and Displacement Maps . a23d.co [引用日期2026-09-29]
浏览次数:0 次
阅读量:0 次 · 阅读完成量:0 次
最近更新:2026-09-29T11:53:02Z
完成率 = 阅读完成量 ÷ 阅读量,分母是阅读量不是浏览次数 —— 关了 JS 的、秒退的都在浏览次数里、不在阅读量里。 详细口径在后台的「数据统计」页。