Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions src/core/shaders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,22 +172,22 @@ 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).
// texelSize = 1/displayRes; density FBO is at simScale (0.5×), so s=6 display px
// ≈ 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);

Expand Down
18 changes: 9 additions & 9 deletions src/core/wgsl-shaders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Loading