视差贴图
什么是视差贴图
视差贴图(Parallax Mapping)是一种先进的纹理映射技术,用于在平面表面上模拟凹凸不平的立体效果。它通过根据观察角度和表面高度图(Height Map)来偏移纹理坐标,使得纹理的不同部分产生视差位移,从而营造出比法线贴图更加强烈的深度感。与法线贴图仅改变光照方向不同,视差贴图实际上改变了纹理采样的位置,因此在视角变化时,凸起区域会遮挡凹陷区域,效果更接近真实几何体。
基本原理
视差贴图的核心思想基于简单的几何关系。当观察者从侧面看一个带有高度的表面时,原本在纹理坐标中的点会因为高度而偏移。假设表面有一个高度场 h(u,v),观察方向为 V,那么实际看到的点应该是从原始位置沿着 V 在表面上的投影偏移后的位置。为了简化计算,通常采用近似方法:根据高度 h 和视角的切平面分量,将纹理坐标向视角方向偏移一个量。公式为:
`offset = h * V.xy / V.z`
这种近似在高度变化平缓时效果很好,但在高度变化剧烈或视角非常倾斜时会产生扭曲。
常见类型与变体
基础视差贴图
最简单的形式,使用上述公式进行一次偏移。实现简单,性能开销低,但在陡峭角度下会出现明显的滑动和失真。
带偏移限制的视差贴图
为了减少失真,在偏移量上加上一个缩放因子,通常与视角的切平面夹角相关。这可以防止纹理坐标偏移过大导致的采样错误,但会减弱效果。
陡峭视差贴图(Steep Parallax Mapping)
通过将高度场分成多个层,沿着视线方向逐步采样高度图,找到第一个被遮挡的层,从而得到更精确的偏移。层数越多效果越好,但性能开销也越大。
浮雕视差贴图(Relief Parallax Mapping)
在陡峭视差贴图的基础上进一步细化,在找到的层之间进行插值,获得亚像素级的精确度。效果接近真实位移映射,但计算量较高。
视差遮蔽贴图(Parallax Occlusion Mapping,POM)
一种改进的陡峭视差贴图,通过线性插值或二分查找来精确确定视线与高度场的交点,能够产生自阴影和更准确的轮廓。POM 在现代游戏中广泛使用。
与法线贴图、位移贴图的对比
- **法线贴图**:改变光照计算的法线方向,但不改变纹理坐标,因此表面几何形状不变,没有视差位移。
- **视差贴图**:改变纹理采样坐标,使得纹理看起来有深度,但不改变几何表面,光照仍基于原始法线(除非结合法线贴图)。
- **位移贴图**:实际改变几何体的顶点位置,产生真实的凹凸,需要足够的顶点密度,性能开销最大。
视差贴图通常在片元着色器中实现,需要高度图,并且为了获得最佳效果通常与法线贴图结合使用。
优点与局限
**优点**:
- 相比位移贴图,无需额外几何体,性能开销较低。
- 能产生比法线贴图更真实的深度和视差效果。
- 适合表现砖墙、鹅卵石、雕刻表面等细节。
**局限**:
- 仍然是近似,在极端视角下可能出现扭曲或伪影。
- 表面轮廓边缘仍是平的,无法产生真实的轮廓变化。
- 需要额外的高度图,增加纹理内存和采样次数。
- 对于复杂的几何体,计算量可能较大,特别是 POM 等高级变体。
应用场景
视差贴图常用于游戏和实时渲染中,特别是需要表现细节凹凸的材质,如:
- 建筑墙面、砖块、石板路
- 科幻表面、机械面板
- 地形细节(如岩石、沙砾)
- 任何需要增强深度感的平面材质
在实现时,通常将高度信息存储在法线贴图的 Alpha 通道或单独的高度图中。现代游戏引擎(如 Unity、Unreal)内置了视差贴图或 POM 的支持。
常见问题
视差贴图和法线贴图有什么区别?
法线贴图仅改变光照计算的法线方向,不改变纹理采样位置,因此没有视差位移。视差贴图根据视角偏移纹理坐标,模拟高度差产生的遮挡效果,视觉立体感更强。
视差贴图需要什么额外的纹理?
需要一张高度图(Height Map),通常灰度图表示表面高度。高度图可以单独存储,也可以打包在法线贴图的 Alpha 通道中。
视差贴图有哪些常见类型?
常见类型包括基础视差贴图、带偏移限制的视差贴图、陡峭视差贴图、浮雕视差贴图和视差遮蔽贴图(POM),它们在效果和性能上有所不同。
视差贴图在游戏中的应用有哪些?
广泛用于砖墙、鹅卵石路面、科幻面板、地形细节等,为平面模型增加立体感,提升视觉质量。
视差贴图的性能开销如何?
基础视差贴图性能开销较低,但高级变体如 POM 需要多次纹理采样和循环计算,开销较大。实际应用中需要权衡效果与性能。