视差贴图
Parallax Mapping
法线贴图的凹凸不会随视角移位,也不会互相遮挡。视差贴图用高度场按视角偏移纹理坐标,以几条额外指令换来明显提升;视差遮蔽贴图 (POM,又称浮雕贴图) 沿视线在高度场中步进求交,能表现遮挡和自阴影,但轮廓仍是原始平面。
基本视差贴图
- 2001 年由 Kaneko 提出,经 Welsh 完善推广。在像素处取高度,按高度和视角偏移纹理坐标去取表面另一部分。
- 高度场可单独存,或打包进其他纹理的空闲通道(不相关数据打包可能影响压缩质量)。高度先缩放和偏移:缩放决定高出/低于表面多少,偏移给出不位移的"海平面"。
- 视线向量必须在切线空间。
- 高度变化平缓时效果不错;掠射角时失效:微小高度变化造成很大偏移,取到的位置与原位置高度无关。
偏移限制 (offset limiting)
- 偏移不超过取到的高度,且计算更快。正视时与原式几乎相同;掠射时凹凸感减弱,但远好于随机取样。
- 仍有视角变化时纹理"游动"、立体渲染中两眼深度线索不一致的问题。但只多几条像素着色器指令,就比普通法线贴图有可观提升。
视差遮蔽贴图 (POM) / 浮雕贴图
- 目标是找到视线与高度场的第一个交点。沿投影到表面的视线取固定数量的高度样本,掠射角时取更多样本以免漏掉交点;找到第一个低于高度场的样本后,用它与前一样本的高度差估计交点,再用交点处的法线、颜色等纹理着色。
- 实际把高度场当深度场,矩形平面是表面上限,起点总在高度场之上。
- 交点细化:一步割线法 (Tatarchuk)、二分搜索 (Policarpo 等)、迭代割线法 (Risser 等)。规则采样可并行,迭代法纹理访问更少但要等待结果、做较慢的依赖读取;暴力方法总体表现似乎不错。
- 也能产生硬、软自阴影;多层高度场可表现悬垂、独立重叠表面和双面浮雕替身。
- 部分技术会在着色器中 discard 或写深度,可能损害性能。最佳方法随 GPU 演进、内容和步数而变。
采样与加速
- 必须足够频繁地采样:对尖刺、毛发等高频高度场,可偏移 mipmap 查询并用各向异性 mipmap;也可让高度场分辨率高于法线贴图。有的系统不存法线贴图,用十字滤波器从高度场即时求法线。
- 跳过空白空间:体素化存到表面距离(存储更大);五维位移贴图(内存大得多,支持曲面与自阴影);方向距离图;锥形步进贴图——每位置存锥半径,保证区间内至多一个交点,快速跳跃不漏交点,但需依赖读取和预计算,不适用动态高度场;四叉树浮雕贴图、"最大值 mipmap"等层次结构。
轮廓问题
- 所有方法在轮廓处都会穿帮,显示原表面的光滑轮廓:渲染的三角形决定哪些像素运行着色器,而不是表面实际在哪。
- 对策:二次轮廓近似;壳贴图 (shell mapping)——把每个三角形挤出成棱柱并渲染,覆盖高度场可能出现的所有像素,保持棱柱求交的非线性可得无伪影结果,但昂贵。
- 书中示例:《孤岛危机》用 POM 让一组简单三角形构成的石子路看起来真实。
对比
| 方法 | 遮挡 | 自阴影 | 代价 | 主要问题 |
|---|---|---|---|---|
| 法线贴图 | 无 | 无(可配合地平线贴图) | 低 | 斜看显平 |
| 视差 + 偏移限制 | 无 | 无 | 多几条指令 | 掠射角凹凸减弱、纹理游动 |
| POM / 浮雕 | 有 | 硬/软自阴影 | 随步数增加 | 轮廓仍为原始几何 |
| 壳贴图 | 有 | 有 | 高 | 复杂 |
GEA 的视角:高度图的三种用法(卷 II 11.6.2)
- 高度图记录理想表面在三角形之上或之下的高度,通常存成灰度图(每纹素一个高度值)。它有三种用法,都能让平面看起来有起伏:凹凸贴图、视差遮蔽贴图和置换贴图(卷 II 11.6.2)。
- 视差遮蔽贴图:用高度图人为调整纹理坐标,使平面看起来有随相机"半正确"移动的表面细节。GEA 举例说顽皮狗《神秘海域》系列的弹孔贴花就用了这项技术(见 贴花渲染)。
- 置换贴图:先细分、再按高度图挤出表面多边形,生成真实几何细节;因为是真几何,能正确自遮挡和自阴影,效果最令人信服。书中展示了 DirectX 中运行时细分简单源几何来生成表面细节的例子(见 曲面细分与几何着色器)。
术语分歧:什么是"浮雕贴图"
| 来源 | 浮雕贴图 (relief mapping) 指 |
|---|---|
| RTR4(本页「视差遮蔽贴图 (POM) / 浮雕贴图」) | 与 POM 同类的像素着色器技术:沿视线在高度场中步进求交,轮廓仍是原始平面 |
| GEA 卷 II 11.6.2 | 置换贴图的别名:"Displacement mapping (also known as relief mapping)",即真正细分并挤出几何 |
两书把同一个名词用在不同技术上,阅读文献时要看上下文。这里并列记录。
原书问题(卷 II 11.6.2):文献中的"浮雕贴图"通常不是置换贴图的别名。Policarpo、Oliveira、Comba 的《Real-Time Relief Mapping on Arbitrary Polygonal Surfaces》(I3D 2005)明确是像素驱动的方法:在片元着色器中把视线变换到切线空间,与高度场求交(线性搜索加二分搜索),不细分也不移动任何顶点,因此轮廓仍是原多边形。GEA 所说"真正细分并挤出多边形"的技术应称为置换贴图 (displacement mapping)。
LearnOpenGL 的视角:视差 / 陡峭视差 / POM(Advanced Lighting / Parallax Mapping)
来源:Parallax Mapping;摘录 Advanced Lighting — Parallax Mapping。
用高度/深度图偏移 UV 伪造位移。切线空间里:height=texture(depthMap,uv).r;P = viewDir.xy/viewDir.z * height*scale(除以 z 为默认;去掉则为 offset limiting);uv' = uv - P。常用深度图(高度取反)更易在平面上「挖深」。越界 UV 可 discard(平面有效)。
Steep:把深度分成多层,沿 P 步进直到层深 ≥ 贴图深;层数可按与切线 +Z 的点积在 8–32 间 mix。POM:在碰撞前后两层 UV 间按深度差线性插值。需与法线贴图同用,否则光照与位移错位。陡斜视与轮廓仍有假象;地板/墙面近垂直观察时最稳。术语与 GEA「浮雕」对照见上文。
GPU Gems 的视角:松弛锥步进浮雕映射(GPU Gems 3 第 18 章)
来源:Policarpo & Oliveira《Relaxed Cone Stepping for Relief Mapping》;摘录 Chapter 18. Relaxed Cone Stepping for Relief Mapping — Policarpo, Oliveira。接在上文 POM / 浮雕纹理之后:用预计算锥图做空间跳跃,再接二分精炼。
普通浮雕映射:线性搜索易漏薄结构,二分又可能在「尚未穿入」时就收敛错点。Cone Step Mapping(Dummer)保证不漏第一次相交,但锥角保守,固定步数常停在表面之前,采样坐标与相机空间位置都偏,画面扭曲。松弛锥步进放宽约束——视射线在锥内最多穿入高度场一次——锥显著变宽,跳跃更快;一旦确认在表面下,安全进入二分。离线 为每个纹素求满足约束的最大锥比 ,可与深度同存;运行时约十余次锥步 + 数次二分通常够用。自阴影用同一锥图对光射线求交。深度缩放与平铺只改切线空间射线方向,不必重算锥图。锥图不要用普通平均值做 mip(应取最小锥比或最近点采样)。
出处
- realtime_rendering_4ed.pdf 第 6 章 Texturing
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.6.2 节
- Chapter 18. Relaxed Cone Stepping for Relief Mapping — Policarpo, Oliveira
- developer.nvidia.com/gpugems/gpugems3/part-iii-rendering/chapter-18-relaxed-cone-stepping-relief-mapping
- Advanced Lighting — Parallax Mapping
- learnopengl.com/Advanced-Lighting/Parallax-Mapping