diff --git a/src/core/shaders.ts b/src/core/shaders.ts index 09ef681..869f774 100644 --- a/src/core/shaders.ts +++ b/src/core/shaders.ts @@ -172,7 +172,7 @@ export const displayShader = /* glsl */ ` float obs = texture2D(uObstacle, vUv).r; // Smooth fade: density falls off over the blurred obstacle boundary zone // rather than cutting off at a hard step, eliminating the jagged fringe. - float density = max(texture2D(uTexture, vUv).r, 0.0) * (1.0 - obs); + float density = clamp(texture2D(uTexture, vUv).r, 0.0, 1.0) * (1.0 - obs); float coverage = texture2D(uCoverage, vUv).r; // 8-tap Sobel normal — computes gradient via 3×3 kernel (no centre sample needed). @@ -180,14 +180,14 @@ export const displayShader = /* glsl */ ` // ≈ 3 sim texels per axis. The Sobel kernel properly averages the gradient in // every direction — no 4-tap cross bias that creates 45° circuit-board artefacts. float sx = texelSize.x * 6.0, sy = texelSize.y * 6.0; - float d00 = max(texture2D(uTexture, vUv + vec2(-sx, -sy)).r, 0.0); - float d10 = max(texture2D(uTexture, vUv + vec2(0.0, -sy)).r, 0.0); - float d20 = max(texture2D(uTexture, vUv + vec2( sx, -sy)).r, 0.0); - float d01 = max(texture2D(uTexture, vUv + vec2(-sx, 0.0)).r, 0.0); - float d21 = max(texture2D(uTexture, vUv + vec2( sx, 0.0)).r, 0.0); - float d02 = max(texture2D(uTexture, vUv + vec2(-sx, sy)).r, 0.0); - float d12 = max(texture2D(uTexture, vUv + vec2(0.0, sy)).r, 0.0); - float d22 = max(texture2D(uTexture, vUv + vec2( sx, sy)).r, 0.0); + float d00 = clamp(texture2D(uTexture, vUv + vec2(-sx, -sy)).r, 0.0, 1.0); + float d10 = clamp(texture2D(uTexture, vUv + vec2(0.0, -sy)).r, 0.0, 1.0); + float d20 = clamp(texture2D(uTexture, vUv + vec2( sx, -sy)).r, 0.0, 1.0); + float d01 = clamp(texture2D(uTexture, vUv + vec2(-sx, 0.0)).r, 0.0, 1.0); + float d21 = clamp(texture2D(uTexture, vUv + vec2( sx, 0.0)).r, 0.0, 1.0); + float d02 = clamp(texture2D(uTexture, vUv + vec2(-sx, sy)).r, 0.0, 1.0); + float d12 = clamp(texture2D(uTexture, vUv + vec2(0.0, sy)).r, 0.0, 1.0); + float d22 = clamp(texture2D(uTexture, vUv + vec2( sx, sy)).r, 0.0, 1.0); float gx = (d20 + 2.0*d21 + d22) - (d00 + 2.0*d01 + d02); float gy = (d02 + 2.0*d12 + d22) - (d00 + 2.0*d10 + d20); diff --git a/src/core/wgsl-shaders.ts b/src/core/wgsl-shaders.ts index d36a27b..008ba0c 100644 --- a/src/core/wgsl-shaders.ts +++ b/src/core/wgsl-shaders.ts @@ -313,19 +313,19 @@ struct U { @fragment fn fs(i: VSOut) -> @location(0) vec4f { let obs = textureSample(uObs, samp, i.uv).r; - let density = max(textureSample(uTex, samp, i.uv).r, 0.0) * (1.0 - obs); + let density = clamp(textureSample(uTex, samp, i.uv).r, 0.0, 1.0) * (1.0 - obs); let cov = textureSample(uCov, samp, i.uv).r; let sx = u.texelSize.x * 6.0; let sy = u.texelSize.y * 6.0; - let d00 = max(textureSample(uTex, samp, i.uv + vec2f(-sx, -sy)).r, 0.0); - let d10 = max(textureSample(uTex, samp, i.uv + vec2f(0.0, -sy)).r, 0.0); - let d20 = max(textureSample(uTex, samp, i.uv + vec2f( sx, -sy)).r, 0.0); - let d01 = max(textureSample(uTex, samp, i.uv + vec2f(-sx, 0.0)).r, 0.0); - let d21 = max(textureSample(uTex, samp, i.uv + vec2f( sx, 0.0)).r, 0.0); - let d02 = max(textureSample(uTex, samp, i.uv + vec2f(-sx, sy)).r, 0.0); - let d12 = max(textureSample(uTex, samp, i.uv + vec2f(0.0, sy)).r, 0.0); - let d22 = max(textureSample(uTex, samp, i.uv + vec2f( sx, sy)).r, 0.0); + let d00 = clamp(textureSample(uTex, samp, i.uv + vec2f(-sx, -sy)).r, 0.0, 1.0); + let d10 = clamp(textureSample(uTex, samp, i.uv + vec2f(0.0, -sy)).r, 0.0, 1.0); + let d20 = clamp(textureSample(uTex, samp, i.uv + vec2f( sx, -sy)).r, 0.0, 1.0); + let d01 = clamp(textureSample(uTex, samp, i.uv + vec2f(-sx, 0.0)).r, 0.0, 1.0); + let d21 = clamp(textureSample(uTex, samp, i.uv + vec2f( sx, 0.0)).r, 0.0, 1.0); + let d02 = clamp(textureSample(uTex, samp, i.uv + vec2f(-sx, sy)).r, 0.0, 1.0); + let d12 = clamp(textureSample(uTex, samp, i.uv + vec2f(0.0, sy)).r, 0.0, 1.0); + let d22 = clamp(textureSample(uTex, samp, i.uv + vec2f( sx, sy)).r, 0.0, 1.0); let gx = (d20 + 2.0*d21 + d22) - (d00 + 2.0*d01 + d02); let gy = (d02 + 2.0*d12 + d22) - (d00 + 2.0*d10 + d20);