53 lines
3.8 KiB
Markdown
53 lines
3.8 KiB
Markdown
# Parallax Occlusion Mapping Node
|
||
|
||
## Description
|
||
|
||
You can use the Parallax Occlusion Mapping (POM) node to create a parallax effect that displaces a material's UVs and depth to create the illusion of depth inside that material.
|
||
|
||
If you receive a texture sampling error while using this node in a graph that includes Custom Function nodes or Subgraphs, try upgrading to Shader Graph version 10.3 or later. This may resolve the errors..
|
||
|
||
When you assign the same Texture2D to a POM node and a Sample Texture 2D node, you need to avoid transforming the UV coordinates twice. To prevent this, connect the Split Texture Transform node’s **Texture Only** port to the Sample Texture 2D Node’s **UV** port.
|
||
|
||
![](images/ParallaxOcclusionMappingThumb.png)
|
||
|
||
## Ports
|
||
|
||
| Name | **Direction** | Type | Description |
|
||
| --- | --- | --- | --- |
|
||
| **Heightmap** | Input | Texture2D | The Texture that specifies the depth of the displacement. |
|
||
| **Heightmap Sampler** | Input | Sampler State | The Sampler to sample **Heightmap** with. |
|
||
| **Amplitude** | Input | Float | A multiplier to apply to the height of the **Heightmap** (in centimeters). |
|
||
| **Steps** | Input | Float | The number of steps that the linear search of the algorithm performs. |
|
||
| **UVs** | Input | Vector2 | The UVs that the sampler uses to sample the Texture. |
|
||
| **Tiling** | Input | Vector2 | The tiling to apply to the input UVs. |
|
||
| **Offset**| Input | Vector2 | The offset to apply to the input UVs. |
|
||
| **Primitive Size** | Vector2 | Float | Size of the UV space in object space. For example, a Unity built-in Plane mesh has a primitive size of (10,10). |
|
||
| **LOD** | Input | Float | The level of detail to use to sample the **Heightmap**. This value should always be positive. |
|
||
| **LOD Threshold** | Input | Float | The **Heightmap** mip level where the Parallax Occlusion Mapping effect begins to fade out. This is equivalent to the **Fading Mip Level Start** property in the High Definition Render Pipeline's (HDRP) [Lit Material](https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@latest/index.html?subfolder=/manual/Lit-Shader.html). |
|
||
| **Pixel Depth Offset** | Output |Float | The offset to apply to the depth buffer to produce the illusion of depth. Connect this output to the **Depth Offset** on the Master Node to enable effects that rely on the depth buffer, such as shadows and screen space ambient occlusion. |
|
||
| **Parallax UVs** | Output| Vector2 | UVs that you have added the parallax offset to. |
|
||
|
||
## Generated Code Example
|
||
|
||
The following example code represents one possible outcome of this node.
|
||
|
||
```
|
||
float3 ParallaxOcclusionMapping_ViewDir = IN.TangentSpaceViewDirection * GetDisplacementObjectScale().xzy;
|
||
float ParallaxOcclusionMapping_NdotV = ParallaxOcclusionMapping_ViewDir.z;
|
||
float ParallaxOcclusionMapping_MaxHeight = Amplitude * 0.01;
|
||
ParallaxOcclusionMapping_MaxHeight *= 2.0 / ( abs(Tiling.x) + abs(Tiling.y) );
|
||
|
||
float2 ParallaxOcclusionMapping_UVSpaceScale = ParallaxOcclusionMapping_MaxHeight * Tiling / PrimitiveSize;
|
||
|
||
// Transform the view vector into the UV space.
|
||
float3 ParallaxOcclusionMapping_ViewDirUV = normalize(float3(ParallaxOcclusionMapping_ViewDir.xy * ParallaxOcclusionMapping_UVSpaceScale, 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);
|
||
```
|