视差贴图(Parallax Mapping)节点是Unity URP Shader Graph中用于实现高级视觉效果的重要工具,它通过在材质表面创建深度错觉来增强三维感。这种技术基于观察者视角的变化动态调整纹理坐标,使得平坦的表面能够呈现出令人信服的深度和立体感。
视差映射的基本原理是利用高度贴图信息来模拟光线在凹凸表面上的交互行为。当摄像机或观察者移动时,纹理采样点会根据高度值发生偏移,创造出表面凹凸不平的视觉假象。与传统的法线贴图相比,视差映射能够提供更加真实的深度感和自遮挡效果,特别是在倾斜角度观察时效果尤为明显。
此实现采用单步过程,不考虑复杂的遮挡计算,因此在性能开销和视觉效果之间取得了良好的平衡。虽然它无法完全模拟真正的几何位移,但在大多数实际应用场景中,其视觉效果已经足够令人满意。对于需要更高质量效果的场景,可以考虑使用更高级的视差遮蔽映射(Parallax Occlusion Mapping)技术。
视差映射特别适用于需要表现表面细微凹凸的材质,如砖墙、石材、粗糙金属等。通过合理配置参数,可以创造出从细微的纹理细节到明显的凹凸结构的各种效果。在实际应用中,视差映射常与法线贴图、高光贴图等其他贴图技术结合使用,以创建更加丰富和真实的材质表现。
如果在使用自定义函数节点或子图形的Shader Graph中遇到纹理采样错误,建议升级到Unity 10.3或更高版本,这些版本已经修复了相关的兼容性问题。
技术原理
视差映射的核心思想是通过修改纹理坐标来模拟深度变化。当观察者移动时,表面上的点应该根据其高度值发生相应的位移。较高的点应该移动较少,而较低的点应该移动较多,这与真实世界中我们观察凹凸表面的体验一致。
从数学角度来看,视差偏移的计算基于视线向量在切线空间中的方向。切线空间是一个以表面法线、切线和副切线为基向量的局部坐标系系统。在这个空间中,我们可以方便地处理与表面方向相关的计算。
具体的计算过程涉及将视线向量转换到切线空间,然后根据高度贴图的采样值和配置的振幅参数来计算UV偏移量。这个偏移量随后被应用到原始的UV坐标上,产生最终的视差效果。
高度贴图的作用
高度贴图(也称为位移贴图或深度贴图)是视差映射的关键输入。它是一个灰度纹理,其中每个像素的亮度值代表对应点的相对高度。通常,白色表示最高点,黑色表示最低点,灰色则表示中间高度。
高度贴图的质量直接影响最终效果的真实度。高质量的高度贴图应该具有:
- 清晰的细节定义
- 适当的高度对比度
- 与漫反射贴图良好的对应关系
- 无明显的压缩瑕疵
振幅参数的影响
振幅参数控制着视差效果的强度,它以厘米为单位定义高度贴图值的缩放因子。较大的振幅值会产生更强烈的视差效果,表面看起来更加凹凸不平;而较小的值则产生更微妙的效果。
在实际应用中,振幅值的选择需要考虑多个因素:
- 观察距离:远距离观察时需要较大的振幅
- 表面类型:粗糙表面通常需要较大的振幅
- 性能考虑:较大的振幅可能增加视觉瑕疵的风险
端口详解
输入端口
Heightmap(高度贴图)
- 类型:Texture2D
- 描述:这是视差效果的核心输入,用于指定表面各点的相对高度。高度贴图应该是单通道的灰度图像,其中亮度值表示高度信息。较亮的区域代表较高的点,较暗的区域代表较低的点。
Heightmap Sampler(高度贴图采样器)
- 类型:Sampler State
- 描述:定义如何对高度贴图进行采样,包括滤波模式和寻址模式设置。正确的采样器配置对于获得高质量的视差效果至关重要。
Amplitude(振幅)
- 类型:Float
- 描述:控制视差效果的强度,单位为厘米。这个值乘以0.01后用于实际计算,因此输入值100相当于1米的实际位移效果。振幅值需要根据场景比例和期望效果仔细调整。
UVs(纹理坐标)
- 类型:Vector2
- 描述:定义在纹理上进行采样的坐标。这些坐标可以是简单的UV映射,也可以是经过其他节点处理后的复杂坐标。
输出端口
Parallax UVs(视差UV)
- 类型:Vector2
- 描述:经过视差偏移计算后的新纹理坐标。这些坐标应该传递给后续的纹理采样节点,以获取应用了视差效果的最终颜色值。
参数配置指南
高度贴图选择与制作
选择或创建高度贴图时需要考虑以下因素:
- 分辨率应该与漫反射贴图匹配
- 避免过度锐利的边缘,这可能导致视觉瑕疵
- 确保高度变化与表面的实际几何特征一致
- 使用16位深度可以改善高度渐变的质量
振幅参数调优
振幅参数的设置需要平衡视觉效果和稳定性:
- 开始时可设置为10-50厘米的范围进行测试
- 观察不同视角下的效果,确保没有明显的扭曲
- 对于细微的表面纹理,使用较小的值(5-20厘米)
- 对于明显的凹凸结构,可以使用较大的值(50-200厘米)
UV坐标处理
UV坐标的处理方式会影响视差效果的质量:
- 确保UV没有明显的拉伸或压缩
- 对于平铺纹理,使用无缝的高度贴图
- 考虑使用Triplanar映射来处理复杂表面的UV
实际应用示例
砖墙材质实现
创建一个逼真的砖墙材质需要综合考虑多个贴图和参数:
首先准备所需贴图:
- 漫反射贴图:包含砖块的颜色和基本纹理
- 法线贴图:定义表面的微观朝向
- 高度贴图:基于砖块和灰缝的高度差异创建
- 粗糙度贴图:控制表面的反射特性
配置视差映射节点:
- 将砖墙高度贴图连接到Heightmap端口
- 设置Amplitude为15-25厘米,模拟真实的砖块凹凸
- 使用适当的采样器,确保高度细节清晰
在Shader Graph中的连接方式:
高度贴图 → Parallax Mapping节点 → 漫反射贴图采样器
法线贴图 → 法线贴图节点 → 光照计算
地形材质应用
在地形渲染中使用视差映射可以显著增强地面的真实感:
地形材质的特殊考虑:
- 使用较大振幅值(30-100厘米)模拟地形起伏
- 结合多个高度贴图实现多层次细节
- 使用视差映射与曲面细分相结合的技术
性能优化策略:
- 根据观察距离动态调整视差强度
- 在远距离使用简化的视差计算
- 使用LOD系统管理不同细节级别
高级技巧与最佳实践
性能优化
视差映射虽然比几何位移更高效,但仍需要合理的性能管理:
- 在移动平台上谨慎使用,或使用简化的视差实现
- 使用mipmap确保在不同距离下的性能和质量
- 考虑在性能敏感的场景中降低高度贴图的分辨率
视觉质量提升
提高视差效果真实度的技巧:
- 结合环境光遮蔽贴图增强深度感
- 使用视差遮蔽映射改进自遮挡效果
- 实现软阴影增强凹凸表面的光照响应
常见问题解决
处理视差映射中的典型问题:
- 边缘扭曲:调整振幅值或使用边缘淡化
- 纹理拉伸:优化UV映射或使用三平面映射
- 性能问题:实现细节级别系统或使用简化版本
与其他技术的结合
与法线贴图配合
视差映射与法线贴图的结合可以创建极其真实的表面效果:
- 视差映射处理宏观的深度变化
- 法线贴图处理微观的表面朝向
- 两者结合可以实现从毫米级到厘米级的完整表面细节
与物理渲染集成
在现代PBR工作流中集成视差映射:
- 确保高度贴图与粗糙度贴图的一致性
- 在光照计算中考虑视差偏移后的表面位置
- 实现基于高度的材质混合效果
生成的代码示例分析
以下示例代码展示了Parallax Mapping节点在Shader Graph中生成的典型代码结构:
ini
float2 _ParallaxMapping_ParallaxUVs = UVs.xy + ParallaxMapping(Heightmap, Heightmap_Sampler, IN.TangentSpaceViewDirection, Amplitude * 0.01, UVs.xy);
这段代码的关键组成部分:
- 输入参数 :
- Heightmap:高度贴图纹理
- Heightmap_Sampler:高度贴图的采样状态
- IN.TangentSpaceViewDirection:切线空间中的视线方向
- Amplitude * 0.01:缩放后的振幅参数
- UVs.xy:原始UV坐标
- 计算过程 :
- ParallaxMapping函数内部执行实际的高度查询和偏移计算
- 结果被添加到原始UV坐标上
- 最终输出是修改后的UV坐标
- 振幅缩放 :
- 振幅乘以0.01将厘米单位转换为米单位
- 这种缩放确保了与Unity场景单位系统的一致性
【Unity Shader Graph 使用与特效实现】专栏-直达 (欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)