Base-高度图与视差映射
法线贴图让光照看起来凹凸,视差映射让纹理随着视角产生位移,真实位移则直接改变表面几何。三者可能共用高度来源,却修改了不同的数据。
视差映射的价值是在不增加几何细节的情况下改善表面的深度感。代价是采样和近似误差;它并不会自动改变模型轮廓、碰撞或所有阴影。
1. 高度是一份数据,不是一种唯一算法
高度图以标量描述相对高度。如何解释黑白端、零高度位置与单位尺度,需要资产和 Shader 约定。把高度用于顶点偏移,是位移映射;把它用于 UV 偏移,是视差近似;对高度求梯度,又可以生成法线。
因此“高度图就是位移贴图”“视差会移动顶点”都不够准确。决定效果的是消费数据的算法。
2. 为什么要把视线变到切线空间
切线空间里,表面的 T、B 轴对应 UV 方向,N 轴表示离开表面。设 V 是从表面指向相机的归一化切线空间向量,它的 V.xy/V.z 表示沿高度方向移动一单位时,在表面方向产生多少偏移。
下面只示意一种约定:高度值作为向参考面下方延伸的深度,UV 与 T、B 同向,V.z>0:
1 | |
改变高度的定义、视线方向或切线方向,符号也可能改变。不能只复制一个加号或减号,再依靠翻转贴图猜结果。
3. 一次采样为何不够
最简单的方法在原 UV 采高度,然后偏移一次。但真正击中的位置,其高度来自偏移后的坐标;一次采样并没有求解这个隐式关系。
陡峭表面或大高度尺度下,就会出现拉伸、漂浮和错误遮挡。限制偏移可以减轻掠射角爆炸,但这是稳定化措施,并不是准确求交。

原笔记配图:视线与高度近似决定纹理坐标偏移;一次高度采样只是局部近似。
4. POM:沿视线寻找交点
Parallax Occlusion Mapping(视差遮蔽映射,POM)在高度层里逐步前进,同时比较视线深度与高度场深度。当两者发生穿越,再在前后两个样本之间细化交点。
1 | |
层数越多通常越容易捕捉细节,也越耗纹理采样。根据角度分配步数能改善成本,但循环分歧和缓存访问仍需要在目标 GPU 上观察。
5. 材质通道必须跟着同一个交点走
确定最终 UV 后,Base Color、法线、粗糙度等应按相同的表面位置采样,否则砖缝颜色偏移了,法线却还留在原处。高度属于数据,通常不应启用 sRGB 解码。
若图集不能重复平铺,还要处理 UV 越界,避免跨到另一块材质。模型接缝、切线不连续与镜像 UV 也会暴露视差方向不一致的问题。
6. 视差不能代替几何
普通 UV 视差不会修改三角形轮廓,也不自动修改深度缓冲。POM 可以额外输出深度或沿光线追踪自阴影,但这会增加成本与管线约束,并不等同于拥有真实微几何。
近景砖墙、浮雕和地面裂缝常能受益;薄片边缘、明显侧轮廓和需要准确交互的表面,则更适合真实几何或位移。远处应降低或关闭视差,避免为不可见的细节付出多次采样。

原笔记配图:原笔记收录的砖墙凹凸效果。静态画面中的深度感,不意味着几何轮廓真的发生变化。
总结
视差的核心是用高度与视线确定更合理的采样位置。先统一切线空间、深度定义与 UV 方向,再决定一次偏移是否足够;需要遮蔽时使用求交方法,需要轮廓时仍然要考虑几何。