Wiki
628 words
3 minutes
法线贴图

什么是法线贴图?#

法线贴图(Normal Map)是一种用于模拟表面细节的纹理技术。它将每个像素的法线方向信息编码在纹理的 RGB 通道中,让低面数模型在光照计算时表现出高面数模型的凹凸细节感,而无需增加实际的几何体。

法线贴图通常呈现紫蓝色调,因为大多数法线方向接近表面法线方向(Z 轴),对应 RGB 值约为 (0.5, 0.5, 1.0)。

切线空间法线贴图#

法线贴图通常存储在切线空间(Tangent Space)中,即以表面为参考系,法线方向沿 Z 轴。这样做的好处是:

  • 可复用:同一张法线贴图可以用于不同朝向的表面
  • 可压缩:只需存储 XY 分量,Z 可以通过 sqrt(1 - x² - y²) 还原

存储格式与解码#

Unity 在导入时,将贴图类型设置为 Normal Map 后,会对法线贴图使用 DXT5nm 压缩:

  • Alpha(a)通道 → 存储 X 分量
  • Green(g)通道 → 存储 Y 分量
  • Z 分量 → 运行时由 XY 计算还原

因此不能直接读取 RGB 通道,需要使用解码函数:

// URP 中推荐写法,支持缩放控制
half3 normal = UnpackNormalScale(SAMPLE_TEXTURE2D(_BumpMap, sampler_BumpMap, uv), _BumpScale);

两种光照计算方式#

1. 在切线空间下计算(性能更好)#

在顶点着色器中构建世界空间 → 切线空间的变换矩阵(TBN 矩阵的逆),将光照方向和视角方向变换到切线空间。片元着色器中直接用解码出的切线空间法线计算光照。

优点:插值数据量少,性能好,适合移动端。

2. 在世界空间下计算(通用性更强)#

在顶点着色器中构建切线空间 → 世界空间的 TBN 矩阵,传递给片元着色器。在片元着色器中将法线从切线空间变换到世界空间后再计算光照。

优点:世界空间法线可直接用于环境反射、球谐光照(SH)等高级效果,适合 PC 端。

从高度图生成法线贴图#

导入高度图时,除了将类型设置为 Normal Map,还需勾选 Create From Grayscale。额外参数:

  • Bumpiness — 控制凹凸强度
  • FilteringSmooth(Sobel 滤波,平滑)或 Sharp(Scharr 滤波,边缘锐利)

相关知识#

法线贴图
https://fuwari.vercel.app/wiki/normal-map/
Author
Qingswe
Published at
2024-07-03
License
CC BY-NC-SA 4.0