凹凸贴图 Bump
存储内容
单通道灰度图,表示表面凹凸程度(相对位移),灰度值越小表示该位置的表面相对于原表面越向外凸起,灰度值越大表示该位置的表面相对于原表面越向内凹陷。
原理
通过计算灰度图的梯度(偏导数)来估算一个扰动后的法线方向,影响光照计算,并非修改网格。 以最基础的中心差分(Central Difference) 算法为例:
- 假设当前贴图像素位置为
p(x, y),对应高度值为h(x, y) - 通过计算该点左右两个邻居点的高度差$$ \frac{dp}{dx} = h(x + 1, y) - h(x - 1, y) $$
- 计算该点过左右两个邻居点的切线向量(即X分量必为1,Y分量为0,Z分量为高度差)$$ \text{tangent}_x = (1, 0, \frac{dp}{dx}) $$
- 通过计算该点上下两个邻居点的高度差$$ \frac{dp}{dy} = h(x, y + 1) - h(x, y - 1) $$
- 计算该点过左右两个邻居点的切线向量(即X分量为0,Y分量必为1,Z分量为高度差)$$ \text{tangent}_y = (1, 0, \frac{dp}{dy}) $$
- 计算法线(叉乘)$$ \begin{align*} \text{N} &= \text{tangent}_x \times \text{tangent}_y \\ &= \left(-\frac{dp}{dx}, -\frac{dp}{dy}, 1\right) \end{align*} $$
- 归一化$$ N = \text{normalize}(N) $$ 实际应用中,使用索贝尔滤波器(Sobel Filter) 更为常见,因为它是一种带平滑效果的差分算子,对噪声不敏感,计算结果更平滑。
法线贴图 Noramal
法线贴图直接存储表面法线方向,理论上相较于凹凸贴图更直接、更准确,它提供的是每像素独立的法线方向,可以更精确表现雕刻细节、凹槽、划痕等复杂结构,同时避免了梯度计算等复杂运算,尽管法线贴图占用3通道,但现代GPU硬件纹理压缩(如BC5)已经可以高效压缩,仅略高于灰度贴图开销。
范围映射
由于法线数据的分量范围在[−1,1],而纹理颜色值的分量范围为[0,1],因此映射如下: $$ Normal = RGB \times 2 - 1 $$
空间坐标系
切线空间法线贴图更为常用
| 特性 | 切线空间法线贴图 (Tangent Space) | 模型空间法线贴图 (Model Space) |
|---|---|---|
| 坐标系 | 局部于表面 (每个顶点的 T, B, N) | 全局于模型 (模型自身的 XYZ 轴) |
| 颜色特点 | 偏向蓝色 | 颜色丰富多样🌈 |
| 存储内容 | 相对于平滑表面的法线扰动 (R: T, G: B, B: N) |
法线在模型空间中的绝对方向 (R: X, G: Y, B: Z) |
| UV 变形 | 受 UV 扭曲影响较大(TBN 依赖 UV) | 相对不太受 UV 扭曲影响(但极度扭曲仍有问题) |
| 模型旋转 | 不敏感: 贴图不变,光照效果正确(TBN 跟随模型) | 敏感: 模型旋转后,贴图不变则光照效果错位 |
| 变形动画 | 支持: 凹凸跟随表面自然移动 | 不支持: 法线方向固定于模型坐标,动画后位置错误 |
| 纹理拼贴 | 支持: 可无缝拼接重复使用 | 困难: 全局特性导致拼接处法线方向不匹配 |
| 重用性 | 较好: 可在类似形状物体上重用 | 较差: 仅适用于特定模型和特定朝向 |
| 性能开销 | 更高: 需要计算和使用每个顶点的 TBN 矩阵进行转换 | 略低: 可能只需一步模型空间到世界/视图空间的转换 |
| 主要应用 | 动态模型(角色、装备)、可拼贴表面、可变形网格 | 静态模型(建筑、道具)、某些烘焙流程(AO+Normal) |
![]() |
