From 7a22c44a32846db233473dfd2b802f55d9cd664c Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:27:43 +0100 Subject: [PATCH 1/6] feat(pbr): improvements to terrain parallax and parallax shadows --- .../ExtendedMaterials/ExtendedMaterials.hlsli | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index df6570a88b..6c9e3a8030 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -51,10 +51,10 @@ namespace ExtendedMaterials float2 dySize = ddy(texCoordsPerSize); // Find min of change in u and v across quad: compute du and dv magnitude across quad - float2 dTexCoords = dxSize * dxSize + dySize * dySize; + //float2 dTexCoords = dxSize * dxSize + dySize * dySize; // Standard mipmapping uses max here - float minTexCoordDelta = max(dTexCoords.x, dTexCoords.y); + float minTexCoordDelta = min(dot(dxSize, dxSize), dot(dySize, dySize)); // Compute the current mip level (* 0.5 is effectively computing a square root before ) float mipLevel = max(0.5 * log2(minTexCoordDelta), 0); @@ -72,8 +72,8 @@ namespace ExtendedMaterials #if defined(LANDSCAPE) # if defined(TRUE_PBR) -# define HEIGHT_POWER 20 -# define HEIGHT_MULT 2 +# define HEIGHT_POWER 2 +# define HEIGHT_MULT 8 float GetTerrainHeight(PS_INPUT input, float2 coords, float mipLevels[6], DisplacementParams params[6], float blendFactor, float4 w1, float2 w2, out float weights[6]) { float heightBlend = 1 + blendFactor * HEIGHT_POWER; @@ -120,6 +120,9 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } + [unroll] for (int i = 0; i < 6; i++){ + weights[i] = pow(weights[i], heightBlend); + } float wsum = 0; [unroll] for (int i = 0; i < 6; i++) { @@ -133,8 +136,8 @@ namespace ExtendedMaterials return total; } # else -# define HEIGHT_POWER 20 -# define HEIGHT_MULT 2 +# define HEIGHT_POWER 2 +# define HEIGHT_MULT 8 float GetTerrainHeight(PS_INPUT input, float2 coords, float mipLevels[6], DisplacementParams params[6], float blendFactor, float4 w1, float2 w2, out float weights[6]) { float heightBlend = 1 + blendFactor * HEIGHT_POWER; @@ -175,7 +178,9 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - + [unroll] for (int i = 0; i < 6; i++){ + weights[i] = pow(weights[i], heightBlend); + } float wsum = 0; [unroll] for (int i = 0; i < 6; i++) { @@ -207,13 +212,11 @@ namespace ExtendedMaterials float nearBlendToFar = saturate(distance / 2048.0); #if defined(LANDSCAPE) -// When CPM flag is disabled, will use linear blending as before. # if defined(TRUE_PBR) float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; float4 w1 = lerp(input.LandBlendWeights1, smoothstep(0, 1, input.LandBlendWeights1), blendFactor); float2 w2 = lerp(input.LandBlendWeights2.xy, smoothstep(0, 1, input.LandBlendWeights2.xy), blendFactor); - float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); - float scalercp = rcp(scale); + float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); float scalercp = rcp(scale); float maxHeight = 0.1 * scale; # else float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; @@ -230,7 +233,7 @@ namespace ExtendedMaterials #if defined(LANDSCAPE) if (nearBlendToFar < 1.0) { - uint numSteps = uint((max(4, scale * 8) * (1.0 - nearBlendToFar)) + 0.5); + uint numSteps = uint((max(6, scale * 8) * (1.0 - nearBlendToFar)) + 0.5); numSteps = clamp((numSteps + 3) & ~0x03, 4, max(8, scale * 8)); #else # if defined(TRUE_PBR) @@ -403,13 +406,15 @@ namespace ExtendedMaterials float GetParallaxSoftShadowMultiplierTerrain(PS_INPUT input, float2 coords, float mipLevel[6], float3 L, float sh0, float quality, float noise, DisplacementParams params[6]) { if (quality > 0.0) { - float2 rayDir = L.xy * 0.1; float4 multipliers = rcp((float4(1, 2, 3, 4) + noise)); float4 sh; float heights[6] = { 0, 0, 0, 0, 0, 0 }; + float2 rayDir = L.xy * 0.1; # if defined(TRUE_PBR) float scale = max(params[0].HeightScale * input.LandBlendWeights1.x, max(params[1].HeightScale * input.LandBlendWeights1.y, max(params[2].HeightScale * input.LandBlendWeights1.z, max(params[3].HeightScale * input.LandBlendWeights1.w, max(params[4].HeightScale * input.LandBlendWeights2.x, params[5].HeightScale * input.LandBlendWeights2.y))))); + if(scale < 0.01) + return 1.0; rayDir *= scale; sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.25) @@ -418,7 +423,7 @@ namespace ExtendedMaterials sh.z = GetTerrainHeight(input, coords + rayDir * multipliers.z, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.75) sh.w = GetTerrainHeight(input, coords + rayDir * multipliers.w, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); - return 1.0 - saturate(dot(max(0, sh - sh0), 1.0) * shadowIntensity) * quality; + return 1.0 - saturate(dot(max(0, sh - sh0)/scale, 1.0) * shadowIntensity) * quality; # else sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.25) From edaed990c4d2156b503179735e5a8da6ae716848 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sat, 1 Mar 2025 14:28:04 +0000 Subject: [PATCH 2/6] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-forma?= =?UTF-8?q?t=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExtendedMaterials/ExtendedMaterials.hlsli | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index 6c9e3a8030..22095c11bd 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -120,7 +120,8 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++){ + [unroll] for (int i = 0; i < 6; i++) + { weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -178,7 +179,8 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++){ + [unroll] for (int i = 0; i < 6; i++) + { weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -216,7 +218,8 @@ namespace ExtendedMaterials float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; float4 w1 = lerp(input.LandBlendWeights1, smoothstep(0, 1, input.LandBlendWeights1), blendFactor); float2 w2 = lerp(input.LandBlendWeights2.xy, smoothstep(0, 1, input.LandBlendWeights2.xy), blendFactor); - float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); float scalercp = rcp(scale); + float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); + float scalercp = rcp(scale); float maxHeight = 0.1 * scale; # else float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; @@ -413,7 +416,7 @@ namespace ExtendedMaterials # if defined(TRUE_PBR) float scale = max(params[0].HeightScale * input.LandBlendWeights1.x, max(params[1].HeightScale * input.LandBlendWeights1.y, max(params[2].HeightScale * input.LandBlendWeights1.z, max(params[3].HeightScale * input.LandBlendWeights1.w, max(params[4].HeightScale * input.LandBlendWeights2.x, params[5].HeightScale * input.LandBlendWeights2.y))))); - if(scale < 0.01) + if (scale < 0.01) return 1.0; rayDir *= scale; sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); @@ -423,7 +426,7 @@ namespace ExtendedMaterials sh.z = GetTerrainHeight(input, coords + rayDir * multipliers.z, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.75) sh.w = GetTerrainHeight(input, coords + rayDir * multipliers.w, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); - return 1.0 - saturate(dot(max(0, sh - sh0)/scale, 1.0) * shadowIntensity) * quality; + return 1.0 - saturate(dot(max(0, sh - sh0) / scale, 1.0) * shadowIntensity) * quality; # else sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.25) From 4ebeb46559735a6b7053e01b8a3d655ad62a4748 Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:34:54 +0100 Subject: [PATCH 3/6] Update ExtendedMaterials.hlsli --- .../Shaders/ExtendedMaterials/ExtendedMaterials.hlsli | 3 --- 1 file changed, 3 deletions(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index 22095c11bd..a516955235 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -50,9 +50,6 @@ namespace ExtendedMaterials float2 dxSize = ddx(texCoordsPerSize); float2 dySize = ddy(texCoordsPerSize); - // Find min of change in u and v across quad: compute du and dv magnitude across quad - //float2 dTexCoords = dxSize * dxSize + dySize * dySize; - // Standard mipmapping uses max here float minTexCoordDelta = min(dot(dxSize, dxSize), dot(dySize, dySize)); From 45499e0ec02eb59df414fddad8e08879aed7cd04 Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:35:58 +0100 Subject: [PATCH 4/6] Update ExtendedMaterials.hlsli --- .../Shaders/ExtendedMaterials/ExtendedMaterials.hlsli | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index a516955235..3b22030736 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -406,10 +406,10 @@ namespace ExtendedMaterials float GetParallaxSoftShadowMultiplierTerrain(PS_INPUT input, float2 coords, float mipLevel[6], float3 L, float sh0, float quality, float noise, DisplacementParams params[6]) { if (quality > 0.0) { + float2 rayDir = L.xy * 0.1; float4 multipliers = rcp((float4(1, 2, 3, 4) + noise)); float4 sh; float heights[6] = { 0, 0, 0, 0, 0, 0 }; - float2 rayDir = L.xy * 0.1; # if defined(TRUE_PBR) float scale = max(params[0].HeightScale * input.LandBlendWeights1.x, max(params[1].HeightScale * input.LandBlendWeights1.y, max(params[2].HeightScale * input.LandBlendWeights1.z, max(params[3].HeightScale * input.LandBlendWeights1.w, max(params[4].HeightScale * input.LandBlendWeights2.x, params[5].HeightScale * input.LandBlendWeights2.y))))); From 3f600e421061123a3889946b45b7cf148a3a3516 Mon Sep 17 00:00:00 2001 From: ThePagi <32794457+ThePagi@users.noreply.github.com> Date: Sun, 2 Mar 2025 13:48:04 +0100 Subject: [PATCH 5/6] pow 2 instead of mul 2 parallax shadow --- .../ExtendedMaterials/ExtendedMaterials.hlsli | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index 3b22030736..9d7b7ff165 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -50,6 +50,9 @@ namespace ExtendedMaterials float2 dxSize = ddx(texCoordsPerSize); float2 dySize = ddy(texCoordsPerSize); + // Find min of change in u and v across quad: compute du and dv magnitude across quad + //float2 dTexCoords = dxSize * dxSize + dySize * dySize; + // Standard mipmapping uses max here float minTexCoordDelta = min(dot(dxSize, dxSize), dot(dySize, dySize)); @@ -117,8 +120,7 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++) - { + [unroll] for (int i = 0; i < 6; i++){ weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -176,8 +178,7 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++) - { + [unroll] for (int i = 0; i < 6; i++){ weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -215,8 +216,7 @@ namespace ExtendedMaterials float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; float4 w1 = lerp(input.LandBlendWeights1, smoothstep(0, 1, input.LandBlendWeights1), blendFactor); float2 w2 = lerp(input.LandBlendWeights2.xy, smoothstep(0, 1, input.LandBlendWeights2.xy), blendFactor); - float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); - float scalercp = rcp(scale); + float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); float scalercp = rcp(scale); float maxHeight = 0.1 * scale; # else float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; @@ -375,12 +375,6 @@ namespace ExtendedMaterials return coords; } -#if defined(TRUE_PBR) - static const float shadowIntensity = 2.0; -#else - static const float shadowIntensity = 2.0; -#endif - // https://advances.realtimerendering.com/s2006/Tatarchuk-POM.pdf // Cheap method of creating shadows using height for a given light source float GetParallaxSoftShadowMultiplier(float2 coords, float mipLevel, float3 L, float sh0, Texture2D tex, SamplerState texSampler, uint channel, float quality, float noise, DisplacementParams params) @@ -397,7 +391,7 @@ namespace ExtendedMaterials sh.z = AdjustDisplacementNormalized(tex.SampleLevel(texSampler, coords + rayDir * multipliers.z, mipLevel)[channel], params); if (quality > 0.75) sh.w = AdjustDisplacementNormalized(tex.SampleLevel(texSampler, coords + rayDir * multipliers.w, mipLevel)[channel], params); - return 1.0 - saturate(dot(max(0, sh - sh0), 1.0) * shadowIntensity) * quality; + return pow(1.0 - saturate(dot(max(0, sh - sh0), 1.0)) * quality, 2.0); } return 1.0; } @@ -406,14 +400,14 @@ namespace ExtendedMaterials float GetParallaxSoftShadowMultiplierTerrain(PS_INPUT input, float2 coords, float mipLevel[6], float3 L, float sh0, float quality, float noise, DisplacementParams params[6]) { if (quality > 0.0) { - float2 rayDir = L.xy * 0.1; float4 multipliers = rcp((float4(1, 2, 3, 4) + noise)); float4 sh; float heights[6] = { 0, 0, 0, 0, 0, 0 }; + float2 rayDir = L.xy * 0.1; # if defined(TRUE_PBR) float scale = max(params[0].HeightScale * input.LandBlendWeights1.x, max(params[1].HeightScale * input.LandBlendWeights1.y, max(params[2].HeightScale * input.LandBlendWeights1.z, max(params[3].HeightScale * input.LandBlendWeights1.w, max(params[4].HeightScale * input.LandBlendWeights2.x, params[5].HeightScale * input.LandBlendWeights2.y))))); - if (scale < 0.01) + if(scale < 0.01) return 1.0; rayDir *= scale; sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); @@ -423,7 +417,7 @@ namespace ExtendedMaterials sh.z = GetTerrainHeight(input, coords + rayDir * multipliers.z, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.75) sh.w = GetTerrainHeight(input, coords + rayDir * multipliers.w, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); - return 1.0 - saturate(dot(max(0, sh - sh0) / scale, 1.0) * shadowIntensity) * quality; + return pow(1.0 - saturate(dot(max(0, sh - sh0)/scale, 1.0)) * quality, 2.0); # else sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.25) @@ -432,7 +426,7 @@ namespace ExtendedMaterials sh.z = GetTerrainHeight(input, coords + rayDir * multipliers.z, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.75) sh.w = GetTerrainHeight(input, coords + rayDir * multipliers.w, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); - return 1.0 - saturate(dot(max(0, sh - sh0), 1.0) * shadowIntensity) * quality; + return pow(1.0 - saturate(dot(max(0, sh - sh0), 1.0)) * quality, 2.0); # endif } return 1.0; From 6ec9b553aa57fbd1d1d521e9f3d489068d6b68a7 Mon Sep 17 00:00:00 2001 From: ThePagi Date: Sun, 2 Mar 2025 12:48:27 +0000 Subject: [PATCH 6/6] =?UTF-8?q?style:=20=F0=9F=8E=A8=20apply=20clang-forma?= =?UTF-8?q?t=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExtendedMaterials/ExtendedMaterials.hlsli | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli index 9d7b7ff165..8c5fe21643 100644 --- a/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli +++ b/features/Extended Materials/Shaders/ExtendedMaterials/ExtendedMaterials.hlsli @@ -120,7 +120,8 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++){ + [unroll] for (int i = 0; i < 6; i++) + { weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -178,7 +179,8 @@ namespace ExtendedMaterials total += h * weights[5]; weights[5] *= pow(heightBlend, HEIGHT_MULT * h); } - [unroll] for (int i = 0; i < 6; i++){ + [unroll] for (int i = 0; i < 6; i++) + { weights[i] = pow(weights[i], heightBlend); } float wsum = 0; @@ -216,7 +218,8 @@ namespace ExtendedMaterials float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; float4 w1 = lerp(input.LandBlendWeights1, smoothstep(0, 1, input.LandBlendWeights1), blendFactor); float2 w2 = lerp(input.LandBlendWeights2.xy, smoothstep(0, 1, input.LandBlendWeights2.xy), blendFactor); - float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); float scalercp = rcp(scale); + float scale = max(params[0].HeightScale * w1.x, max(params[1].HeightScale * w1.y, max(params[2].HeightScale * w1.z, max(params[3].HeightScale * w1.w, max(params[4].HeightScale * w2.x, params[5].HeightScale * w2.y))))); + float scalercp = rcp(scale); float maxHeight = 0.1 * scale; # else float blendFactor = SharedData::extendedMaterialSettings.EnableHeightBlending ? sqrt(saturate(1 - nearBlendToFar)) : 0; @@ -407,7 +410,7 @@ namespace ExtendedMaterials # if defined(TRUE_PBR) float scale = max(params[0].HeightScale * input.LandBlendWeights1.x, max(params[1].HeightScale * input.LandBlendWeights1.y, max(params[2].HeightScale * input.LandBlendWeights1.z, max(params[3].HeightScale * input.LandBlendWeights1.w, max(params[4].HeightScale * input.LandBlendWeights2.x, params[5].HeightScale * input.LandBlendWeights2.y))))); - if(scale < 0.01) + if (scale < 0.01) return 1.0; rayDir *= scale; sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); @@ -417,7 +420,7 @@ namespace ExtendedMaterials sh.z = GetTerrainHeight(input, coords + rayDir * multipliers.z, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.75) sh.w = GetTerrainHeight(input, coords + rayDir * multipliers.w, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); - return pow(1.0 - saturate(dot(max(0, sh - sh0)/scale, 1.0)) * quality, 2.0); + return pow(1.0 - saturate(dot(max(0, sh - sh0) / scale, 1.0)) * quality, 2.0); # else sh = GetTerrainHeight(input, coords + rayDir * multipliers.x, mipLevel, params, quality, input.LandBlendWeights1, input.LandBlendWeights2.xy, heights); if (quality > 0.25)