diff --git a/package/Shaders/Common/FrameBuffer.hlsli b/package/Shaders/Common/FrameBuffer.hlsli index e429c17d3d..f3479c616b 100644 --- a/package/Shaders/Common/FrameBuffer.hlsli +++ b/package/Shaders/Common/FrameBuffer.hlsli @@ -112,6 +112,12 @@ namespace FrameBuffer return mul(CameraView[a_eyeIndex], newPosition).xyz; } + float3 ViewToWorld(float3 x, bool is_position = true, uint a_eyeIndex = 0) + { + float4 newPosition = float4(x, (float)is_position); + return mul(CameraViewInverse[a_eyeIndex], newPosition).xyz; + } + float2 ViewToUV(float3 x, bool is_position = true, uint a_eyeIndex = 0) { float4 newPosition = float4(x, (float)is_position); diff --git a/package/Shaders/DistantTree.hlsl b/package/Shaders/DistantTree.hlsl index 862a687352..956ab0bd60 100644 --- a/package/Shaders/DistantTree.hlsl +++ b/package/Shaders/DistantTree.hlsl @@ -233,7 +233,10 @@ PS_OUTPUT main(PS_INPUT input) float3 ddx = ddx_coarse(input.WorldPosition.xyz); float3 ddy = ddy_coarse(input.WorldPosition.xyz); - float3 normal = normalize(cross(ddx, ddy)); + float3 normal = -normalize(cross(ddx, ddy)); + normal.xyz = normalize(FrameBuffer::WorldToView(normal.xyz, false, eyeIndex)); + normal.z = -abs(normal.z); + normal.xyz = normalize(FrameBuffer::ViewToWorld(normal.xyz, false, eyeIndex)); # if !defined(SSGI) float3 directionalAmbientColor = max(0, mul(SharedData::DirectionalAmbient, float4(normal, 1.0))); diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index d441518188..9ec1ad2568 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -1007,6 +1007,13 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float3x3 tbnTr = transpose(tbn); + // Fix incorrect normals without flipping everything +#if defined(TREE_ANIM) + tbnTr[2].xyz = normalize(FrameBuffer::WorldToView(tbnTr[2].xyz, false, eyeIndex)); + tbnTr[2].z = -abs(tbnTr[2].z); + tbnTr[2].xyz = normalize(FrameBuffer::ViewToWorld(tbnTr[2].xyz, false, eyeIndex)); +#endif + # endif // defined (SKINNED) || !defined (MODELSPACENORMALS) # if !defined(TRUE_PBR) diff --git a/package/Shaders/RunGrass.hlsl b/package/Shaders/RunGrass.hlsl index 2521f5e0da..108cad237d 100644 --- a/package/Shaders/RunGrass.hlsl +++ b/package/Shaders/RunGrass.hlsl @@ -883,6 +883,9 @@ PS_OUTPUT main(PS_INPUT input) float3 ddx = ddx_coarse(input.WorldPosition); float3 ddy = ddy_coarse(input.WorldPosition); float3 normal = -normalize(cross(ddx, ddy)); + normal.xyz = normalize(FrameBuffer::WorldToView(normal.xyz, false, eyeIndex)); + normal.z = -abs(normal.z); + normal.xyz = normalize(FrameBuffer::ViewToWorld(normal.xyz, false, eyeIndex)); normal = normalize(float3(normal.xy, max(0, normal.z)));