Parallax Occlusion Mapping 节点
描述
视差遮挡贴图 (Parallax Occlusion Mapping, POM) 节点允许创建视差效果,这种效果可以对材质的 UV 和深度进行移位以便在材质内产生深度感。
如果在包含自定义函数节点或子图形的图形中使用此节点时遇到纹理采样错误,可以通过升级到 10.3 或更高版本来解决这些问题。
端口
名称 | 方向 | 类型 | 描述 |
---|---|---|---|
Heightmap | 输入 | Texture2D | 用于指定位移深度的纹理。 |
Heightmap Sampler | 输入 | Sampler State | 用于对高度贴图进行采样的采样器。 |
Amplitude | 输入 | Float | 应用于高度贴图的高度(以厘米为单位)的乘数。 |
Steps | 输入 | Float | 算法线性搜索执行的步骤数。 |
UVs | 输入 | Vector2 | 采样器用来采样纹理的 UV。 |
Lod | 输入 | Float | 用于采样高度贴图的细节级别。 |
Lod Threshold | 输入 | Float | POM 效果开始淡出的高度贴图 Mip 级别。这等效于高清渲染管线 (HDRP) 光照材质中的 Fading Mip Level Start 属性。 |
Depth Offset | 输出 | Float | 应用于深度缓冲区以产生深度感的偏移。要启用依赖深度缓冲区的效果,例如阴影和屏幕空间环境光遮挡,请将此输出连接到主节点上的深度偏移 (Depth Offset)。 |
Parallax UVs | 输出 | Vector2 | 添加视差偏移后的 UV。 |
生成的代码示例
以下示例代码表示此节点的一种可能结果。
float3 ParallaxOcclusionMapping_ViewDir = IN.TangentSpaceViewDirection * GetDisplacementObjectScale().xzy;
float ParallaxOcclusionMapping_NdotV = ParallaxOcclusionMapping_ViewDir.z;
float ParallaxOcclusionMapping_MaxHeight = Amplitude * 0.01;
// Transform the view vector into the UV space.
float3 ParallaxOcclusionMapping_ViewDirUV = normalize(float3(ParallaxOcclusionMapping_ViewDir.xy * ParallaxOcclusionMapping_MaxHeight, ParallaxOcclusionMapping_ViewDir.z)); // TODO: skip normalize
PerPixelHeightDisplacementParam ParallaxOcclusionMapping_POM;
ParallaxOcclusionMapping_POM.uv = UVs.xy;
float ParallaxOcclusionMapping_OutHeight;
float2 _ParallaxOcclusionMapping_ParallaxUVs = UVs.xy + ParallaxOcclusionMapping(Lod, Lod_Threshold, Steps, ParallaxOcclusionMapping_ViewDirUV, ParallaxOcclusionMapping_POM, ParallaxOcclusionMapping_OutHeight);
float _ParallaxOcclusionMapping_PixelDepthOffset = (ParallaxOcclusionMapping_MaxHeight - ParallaxOcclusionMapping_OutHeight * ParallaxOcclusionMapping_MaxHeight) / max(ParallaxOcclusionMapping_NdotV, 0.0001);