diff --git a/Source/Shaders/GI/GlobalSurfaceAtlas.shader b/Source/Shaders/GI/GlobalSurfaceAtlas.shader index 716d63352..cfd2d67c5 100644 --- a/Source/Shaders/GI/GlobalSurfaceAtlas.shader +++ b/Source/Shaders/GI/GlobalSurfaceAtlas.shader @@ -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()) diff --git a/Source/Shaders/GlobalSignDistanceField.hlsl b/Source/Shaders/GlobalSignDistanceField.hlsl index 466b56604..41ce0c00e 100644 --- a/Source/Shaders/GlobalSignDistanceField.hlsl +++ b/Source/Shaders/GlobalSignDistanceField.hlsl @@ -262,7 +262,8 @@ float3 SampleGlobalSDFGradient(const GlobalSDFData data, Texture3D // 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 tex, Texture3D 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 tex, Texture3D 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 } // Move forward - stepTime += max(stepDistance, voxelSize); + stepTime += max(stepDistance, voxelSize) * stepScale; } hit.StepsCount += step; } diff --git a/Source/Shaders/GlobalSignDistanceField.shader b/Source/Shaders/GlobalSignDistanceField.shader index 0c80bdb12..739b6f683 100644 --- a/Source/Shaders/GlobalSignDistanceField.shader +++ b/Source/Shaders/GlobalSignDistanceField.shader @@ -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;