From f280412ef474456705b109c0a8e0c514bb813b14 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 16 Dec 2025 16:04:56 +0100 Subject: [PATCH] Remove `NeedsHitNormal`/`HitNormal` feature from `GlobalSDFTrace` to simplify code --- Source/Shaders/GI/GlobalSurfaceAtlas.shader | 2 - Source/Shaders/GlobalSignDistanceField.hlsl | 15 ------- Source/Shaders/GlobalSignDistanceField.shader | 39 ++++++++++++------- 3 files changed, 26 insertions(+), 30 deletions(-) diff --git a/Source/Shaders/GI/GlobalSurfaceAtlas.shader b/Source/Shaders/GI/GlobalSurfaceAtlas.shader index 6778a7cd7..6930107d1 100644 --- a/Source/Shaders/GI/GlobalSurfaceAtlas.shader +++ b/Source/Shaders/GI/GlobalSurfaceAtlas.shader @@ -328,7 +328,6 @@ float4 PS_Debug(Quad_VS2PS input) : SV_Target float3 viewRay = lerp(lerp(ViewFrustumWorldRays[3], ViewFrustumWorldRays[0], input.TexCoord.x), lerp(ViewFrustumWorldRays[2], ViewFrustumWorldRays[1], input.TexCoord.x), 1 - input.TexCoord.y).xyz; viewRay = normalize(viewRay - ViewWorldPos); trace.Init(ViewWorldPos, viewRay, ViewNearPlane, ViewFarPlane); - trace.NeedsHitNormal = true; GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace); float3 color; @@ -337,7 +336,6 @@ float4 PS_Debug(Quad_VS2PS input) : SV_Target // Sample Global Surface Atlas at the hit location float surfaceThreshold = GetGlobalSurfaceAtlasThreshold(GlobalSDF, hit); color = SampleGlobalSurfaceAtlas(GlobalSurfaceAtlas, GlobalSurfaceAtlasChunks, GlobalSurfaceAtlasCulledObjects, GlobalSurfaceAtlasObjects, GlobalSurfaceAtlasDepth, GlobalSurfaceAtlasTex, hit.GetHitPosition(trace), -viewRay, surfaceThreshold).rgb; - //color = hit.HitNormal * 0.5f + 0.5f; } else { diff --git a/Source/Shaders/GlobalSignDistanceField.hlsl b/Source/Shaders/GlobalSignDistanceField.hlsl index 8075c081d..67a48e183 100644 --- a/Source/Shaders/GlobalSignDistanceField.hlsl +++ b/Source/Shaders/GlobalSignDistanceField.hlsl @@ -33,7 +33,6 @@ struct GlobalSDFTrace float3 WorldDirection; float MaxDistance; float StepScale; - bool NeedsHitNormal; void Init(float3 worldPosition, float3 worldDirection, float minDistance, float maxDistance, float stepScale = 1.0f) { @@ -42,7 +41,6 @@ struct GlobalSDFTrace MinDistance = minDistance; MaxDistance = maxDistance; StepScale = stepScale; - NeedsHitNormal = false; } }; @@ -326,19 +324,6 @@ GlobalSDFHit RayTraceGlobalSDF(const GlobalSDFData data, Texture3D hit.HitTime = max(stepTime + stepDistance - minSurfaceThickness, 0.0f); hit.HitCascade = cascade; hit.HitSDF = stepDistance; - if (trace.NeedsHitNormal) - { - // Calculate hit normal from SDF gradient - float texelOffset = 1.0f / data.Resolution; - ClampGlobalSDFTextureGradientUV(data, cascade, texelOffset, textureUV); - float xp = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x + texelOffset, textureUV.y, textureUV.z), 0).x; - float xn = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x - texelOffset, textureUV.y, textureUV.z), 0).x; - float yp = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x, textureUV.y + texelOffset, textureUV.z), 0).x; - float yn = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x, textureUV.y - texelOffset, textureUV.z), 0).x; - float zp = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x, textureUV.y, textureUV.z + texelOffset), 0).x; - float zn = tex.SampleLevel(GLOBAL_SDF_SAMPLER, float3(textureUV.x, textureUV.y, textureUV.z - texelOffset), 0).x; - hit.HitNormal = normalize(float3(xp - xn, yp - yn, zp - zn)); - } } // Move forward diff --git a/Source/Shaders/GlobalSignDistanceField.shader b/Source/Shaders/GlobalSignDistanceField.shader index 461dba08d..fe4bafda5 100644 --- a/Source/Shaders/GlobalSignDistanceField.shader +++ b/Source/Shaders/GlobalSignDistanceField.shader @@ -311,26 +311,39 @@ float4 PS_Debug(Quad_VS2PS input) : SV_Target float3 viewRay = lerp(lerp(ViewFrustumWorldRays[3], ViewFrustumWorldRays[0], input.TexCoord.x), lerp(ViewFrustumWorldRays[2], ViewFrustumWorldRays[1], input.TexCoord.x), 1 - input.TexCoord.y).xyz; viewRay = normalize(viewRay - ViewWorldPos); trace.Init(ViewWorldPos, viewRay, ViewNearPlane, ViewFarPlane); - trace.NeedsHitNormal = true; GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace); // Debug draw - float3 color = saturate(hit.StepsCount / 80.0f).xxx; - if (!hit.IsHit()) - color.rg *= 0.4f; -#if 0 - else - { + float3 color = saturate(hit.StepsCount / 50.0f).xxx; + if (hit.IsHit()) + { +#if 1 + float3 hitPosition = hit.GetHitPosition(trace); + float hitSDF; + float3 hitNormal = SampleGlobalSDFGradient(GlobalSDF, GlobalSDFTex, GlobalSDFMip, hitPosition, hitSDF, hit.HitCascade); +#if 1 + // Composite step count with SDF normals + //color.rgb *= saturate(normalize(hitNormal) * 0.5f + 0.7f) + 0.3f; + color = lerp(normalize(hitNormal) * 0.5f + 0.5f, 1 - color, saturate(hit.StepsCount / 80.0f)); +#else // Debug draw SDF normals - color.rgb = normalize(hit.HitNormal) * 0.5f + 0.5f; - } -#elif 1 + color = normalize(hitNormal) * 0.5f + 0.5f; +#endif +#else + // Heatmap with step count + if (hit.StepsCount > 40) + color = float3(saturate(hit.StepsCount / 80.0f), 0, 0); + else if (hit.StepsCount > 20) + color = float3(saturate(hit.StepsCount / 40.0f).xx, 0); + else + color = float3(0, saturate(hit.StepsCount / 20.0f), 0); +#endif + } else { - // Composite with SDF normals - color.rgb *= saturate(normalize(hit.HitNormal) * 0.5f + 0.7f) + 0.1f; + // Bluish sky + color.rg *= 0.4f; } -#endif return float4(color, 1); }