Add noise to Global SDF and Surface Atlas debug preview to smooth the tracing

This commit is contained in:
2026-06-18 13:57:22 +02:00
parent 4bd3977e25
commit fc9de76ade
3 changed files with 14 additions and 4 deletions
+4 -1
View File
@@ -5,6 +5,7 @@
#include "./Flax/Common.hlsl"
#include "./Flax/Math.hlsl"
#include "./Flax/Noise.hlsl"
#include "./Flax/LightingCommon.hlsl"
#include "./Flax/GlobalSignDistanceField.hlsl"
#include "./Flax/GI/GlobalSurfaceAtlas.hlsl"
@@ -350,7 +351,9 @@ 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);
GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace);
trace.WorldPosition += rand3dTo3d(float3(input.TexCoord, viewRay.x)); // Noise a bit
float stepScale = lerp(rand3dTo1d(trace.WorldPosition), 0.7f, 0.9f); // Boost precision
GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace, 0.0f, stepScale);
float3 color;
if (hit.IsHit())
+3 -2
View File
@@ -262,7 +262,8 @@ float3 SampleGlobalSDFGradient(const GlobalSDFData data, Texture3D<snorm float>
// Ray traces the Global SDF.
// cascadeTraceStartBias - scales the trace start position offset (along the trace direction) by cascade voxel size (reduces artifacts on far cascades). Use it for shadow rays to prevent self-occlusion when tracing from object surface that looses quality in far cascades.
GlobalSDFHit RayTraceGlobalSDF(const GlobalSDFData data, Texture3D<snorm float> tex, Texture3D<snorm float> mip, const GlobalSDFTrace trace, float cascadeTraceStartBias = 0.0f)
// stepScale - scales the step size used for ray marching. Can be variable per-pixel noise to smooth results (esp. for temporal accumulation).
GlobalSDFHit RayTraceGlobalSDF(const GlobalSDFData data, Texture3D<snorm float> tex, Texture3D<snorm float> mip, const GlobalSDFTrace trace, float cascadeTraceStartBias = 0.0f, float stepScale = 1.0f)
{
GlobalSDFHit hit = (GlobalSDFHit)0;
hit.HitTime = -1.0f;
@@ -324,7 +325,7 @@ GlobalSDFHit RayTraceGlobalSDF(const GlobalSDFData data, Texture3D<snorm float>
}
// Move forward
stepTime += max(stepDistance, voxelSize);
stepTime += max(stepDistance, voxelSize) * stepScale;
}
hit.StepsCount += step;
}
@@ -2,6 +2,7 @@
#include "./Flax/Common.hlsl"
#include "./Flax/Math.hlsl"
#include "./Flax/Noise.hlsl"
#include "./Flax/GlobalSignDistanceField.hlsl"
#include "./Flax/TerrainCommon.hlsl"
@@ -315,12 +316,17 @@ 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);
GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace);
trace.WorldPosition += rand3dTo3d(float3(input.TexCoord, viewRay.x)); // Noise a bit
float stepScale = lerp(rand3dTo1d(trace.WorldPosition), 0.7f, 0.9f); // Boost precision
GlobalSDFHit hit = RayTraceGlobalSDF(GlobalSDF, GlobalSDFTex, GlobalSDFMip, trace, 0.0f, stepScale);
// Debug draw
float3 color = saturate(hit.StepsCount / 50.0f).xxx;
if (hit.IsHit())
{
// Normalize step count back to default scale (higher precision is just for preview)
hit.StepsCount *= stepScale;
#if 1
float3 hitPosition = hit.GetHitPosition(trace);
float hitSDF;