凹凸贴图 Bump

存储内容

单通道灰度图,表示表面凹凸程度(相对位移),灰度值越小表示该位置的表面相对于原表面越向外凸起,灰度值越大表示该位置的表面相对于原表面越向内凹陷。

原理

通过计算灰度图的梯度(偏导数)来估算一个扰动后的法线方向,影响光照计算,并非修改网格。 以最基础的中心差分(Central Difference) 算法为例:

  1. 假设当前贴图像素位置为p(x, y),对应高度值为h(x, y)
  2. 通过计算该点​​左右两个邻居​点的高度差$$ \frac{dp}{dx} = h(x + 1, y) - h(x - 1, y) $$
  3. 计算该点过左右两个邻居​点的切线向量(即X分量必为1,Y分量为0,Z分量为高度差)$$ \text{tangent}_x = (1, 0, \frac{dp}{dx}) $$
  4. 通过计算该点​​上下两个邻居​点的高度差$$ \frac{dp}{dy} = h(x, y + 1) - h(x, y - 1) $$
  5. 计算该点过左右两个邻居​点的切线向量(即X分量为0,Y分量必为1,Z分量为高度差)$$ \text{tangent}_y = (1, 0, \frac{dp}{dy}) $$
  6. 计算法线(叉乘)$$ \begin{align*} \text{N} &= \text{tangent}_x \times \text{tangent}_y \\ &= \left(-\frac{dp}{dx}, -\frac{dp}{dy}, 1\right) \end{align*} $$
  7. 归一化$$ 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)
法线贴图的空间类型

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/%E4%BB%8E-%E5%87%B9%E5%87%B8%E8%B4%B4%E5%9B%BE-%E5%88%B0-%E6%B3%95%E7%BA%BF%E8%B4%B4%E5%9B%BE/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键