Skip to content

Commit 0bf50e4

Browse files
Fixed planar/triplanar so that tangent space normal aren't flipped when facing away from the world axes.
1 parent 36184e4 commit 0bf50e4

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

Assets/ScriptableRenderLoop/HDRenderLoop/Material/Lit/LitSurfaceData.hlsl

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,33 @@ void ADD_IDX(ComputeLayerTexCoord)(FragInput input, bool isTriplanar, inout Laye
99
ADD_IDX(layerTexCoord.base).uv = ADD_IDX(_UVMappingMask).x * input.texCoord0 +
1010
ADD_IDX(_UVMappingMask).y * input.texCoord1 +
1111
ADD_IDX(_UVMappingMask).z * input.texCoord3 +
12-
ADD_IDX(_UVMappingMask).w * position.xz;
12+
ADD_IDX(_UVMappingMask).w * -position.xz;
1313

1414
float2 uvDetails = ADD_IDX(_UVDetailsMappingMask).x * input.texCoord0 +
1515
ADD_IDX(_UVDetailsMappingMask).y * input.texCoord1 +
1616
ADD_IDX(_UVDetailsMappingMask).z * input.texCoord3 +
1717
// Note that if base is planar, detail map is planar
18-
ADD_IDX(_UVMappingMask).w * position.xz;
18+
ADD_IDX(_UVMappingMask).w * -position.xz;
1919

2020
ADD_IDX(layerTexCoord.details).uv = TRANSFORM_TEX(uvDetails, ADD_IDX(_DetailMap));
2121

2222
// triplanar
2323
ADD_IDX(layerTexCoord.base).isTriplanar = isTriplanar;
2424

25-
ADD_IDX(layerTexCoord.base).uvYZ = position.zy;
26-
ADD_IDX(layerTexCoord.base).uvZX = position.xz;
27-
ADD_IDX(layerTexCoord.base).uvXY = float2(-position.x, position.y);
25+
float3 direction = sign(input.tangentToWorld[2].xyz);
26+
27+
// In triplanar, if we are facing away from the world axis, a different axis will be flipped for each direction.
28+
// This is particularly problematic for tangent space normal maps which need to be in the right direction.
29+
// So we multiplying the offending coordinate by the sign of the normal.
30+
ADD_IDX(layerTexCoord.base).uvYZ = float2(direction.x * position.z, position.y);
31+
ADD_IDX(layerTexCoord.base).uvZX = -float2(position.x, direction.y * position.z);
32+
ADD_IDX(layerTexCoord.base).uvXY = float2(-position.x, direction.z * position.y);
2833

2934
ADD_IDX(layerTexCoord.details).isTriplanar = isTriplanar;
3035

31-
ADD_IDX(layerTexCoord.details).uvYZ = TRANSFORM_TEX(position.zy, ADD_IDX(_DetailMap));
32-
ADD_IDX(layerTexCoord.details).uvZX = TRANSFORM_TEX(position.xz, ADD_IDX(_DetailMap));
33-
ADD_IDX(layerTexCoord.details).uvXY = TRANSFORM_TEX(float2(-position.x, position.y), ADD_IDX(_DetailMap));
36+
ADD_IDX(layerTexCoord.details).uvYZ = TRANSFORM_TEX(ADD_IDX(layerTexCoord.base).uvYZ, ADD_IDX(_DetailMap));
37+
ADD_IDX(layerTexCoord.details).uvZX = TRANSFORM_TEX(ADD_IDX(layerTexCoord.base).uvZX, ADD_IDX(_DetailMap));
38+
ADD_IDX(layerTexCoord.details).uvXY = TRANSFORM_TEX(ADD_IDX(layerTexCoord.base).uvXY, ADD_IDX(_DetailMap));
3439
}
3540

3641
void ADD_IDX(ApplyDisplacement)(inout FragInput input, inout LayerTexCoord layerTexCoord)

0 commit comments

Comments
 (0)