From 7e603d7677f9976e86ac178abe0cbf7e241dbd39 Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Mon, 12 Oct 2026 20:21:59 +0200 Subject: [PATCH] contrails: rougher wispy shader with 2D fbm breakup --- vendor/clouds3d.js | 52 +++++++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 6b4d14c..ac717cb 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -5444,28 +5444,46 @@ var CT2_FRAG_SRC = [ 'varying float vV;', 'varying float vS;', 'varying vec3 vWorld;', - 'float hash1(float x) {', - 'return fract(sin(x * 127.1) * 43758.5453);', + 'float hash2(vec2 p) {', + 'return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);', '}', - 'float noise1(float x) {', - 'float i = floor(x);', - 'float f = fract(x);', - 'return mix(hash1(i), hash1(i + 1.0), f);', + 'float noise2(vec2 p) {', + 'vec2 i = floor(p);', + 'vec2 f = fract(p);', + 'f = f * f * (3.0 - 2.0 * f);', + 'return mix(', + 'mix(hash2(i), hash2(i + vec2(1.0, 0.0)), f.x),', + 'mix(hash2(i + vec2(0.0, 1.0)), hash2(i + vec2(1.0, 1.0)), f.x),', + 'f.y);', + '}', + 'float fbm2(vec2 p) {', + 'float v = 0.0;', + 'float a = 0.5;', + 'for (int i = 0; i < 4; i++) {', + 'v += a * noise2(p);', + 'p = p * 2.03 + vec2(13.7, 7.1);', + 'a *= 0.5;', + '}', + 'return v;', '}', 'void main() {', 'float side = abs(vV);', - 'float wob = 0.48 + 0.42 * noise1(vU * 24.0);', - 'float jag = noise1(vU * 61.0 + vV * 17.0) - 0.5;', - 'float edge = 1.0 - smoothstep(wob * 0.16, wob, side + jag * 0.18);', - 'edge *= 0.42 + 0.58 * pow(vU, 0.65);', - 'float dens = 0.58 + 0.42 * noise1(vU * 31.0);', - 'float head = 0.32 + 0.68 * vU;', - 'float a = clamp(vS * edge * head * dens, 0.0, 0.88);', - 'if (a <= 0.004) discard;', - 'vec3 dayCol = vec3(1.0, 1.0, 1.0);', - 'vec3 nightCol = vec3(0.45, 0.55, 0.75);', + 'float edgeNoise = fbm2(vec2(vU * 18.0, vV * 5.0));', + 'float clumpNoise = fbm2(vec2(vU * 43.0 + 11.0, vV * 11.0 - 3.0));', + 'float wob = 0.30 + 0.72 * edgeNoise;', + 'float raggedSide = side + (clumpNoise - 0.5) * 0.42;', + 'float edge = 1.0 - smoothstep(wob * 0.10, wob, raggedSide);', + 'edge *= 0.32 + 0.68 * pow(vU, 0.55);', + 'float dens = fbm2(vec2(vU * 31.0 + vV * 2.0, vU * 7.0 - vV * 4.0));', + 'dens = smoothstep(0.24, 0.86, dens);', + 'float streak = 0.55 + 0.45 * noise2(vec2(vU * 90.0, vV * 2.0));', + 'float head = 0.28 + 0.72 * vU;', + 'float a = clamp(vS * edge * head * dens * streak, 0.0, 0.92);', + 'if (a <= 0.006) discard;', + 'vec3 dayCol = mix(vec3(0.82, 0.84, 0.88), vec3(1.0, 1.0, 1.0), dens);', + 'vec3 nightCol = mix(vec3(0.30, 0.38, 0.55), vec3(0.58, 0.68, 0.88), dens);', 'vec3 col = mix(nightCol, dayCol, clamp(uDay, 0.0, 1.0));', - 'col *= 0.35 + 0.65 * clamp(uDay + uNight, 0.0, 1.0);', + 'col *= 0.32 + 0.68 * clamp(uDay + uNight, 0.0, 1.0);', 'gl_FragColor = vec4(col, a);', '}' ].join('\n');