Remove NeedsHitNormal/HitNormal feature from GlobalSDFTrace to simplify code

This commit is contained in:
Wojtek Figat
2025-12-16 16:04:56 +01:00
parent e257f9e4a0
commit f280412ef4
3 changed files with 26 additions and 30 deletions

View File

@@ -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
{

View File

@@ -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<snorm float>
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

View File

@@ -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);
}