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 — 控制凹凸强度
- Filtering —
Smooth(Sobel 滤波,平滑)或Sharp(Scharr 滤波,边缘锐利)