contrails: rougher wispy shader with 2D fbm breakup

This commit is contained in:
Richard Zink committed 2026-10-12 20:21:59 +02:00
1 parent c15351115f
commit 7e603d7677
1 file changed
+35 -17
+35 -17
View File
@@ -5444,28 +5444,46 @@ var CT2_FRAG_SRC = [
'varying float vV;', 'varying float vV;',
'varying float vS;', 'varying float vS;',
'varying vec3 vWorld;', 'varying vec3 vWorld;',
'float hash1(float x) {', 'float hash2(vec2 p) {',
'return fract(sin(x * 127.1) * 43758.5453);', 'return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);',
'}', '}',
'float noise1(float x) {', 'float noise2(vec2 p) {',
'float i = floor(x);', 'vec2 i = floor(p);',
'float f = fract(x);', 'vec2 f = fract(p);',
'return mix(hash1(i), hash1(i + 1.0), f);', '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() {', 'void main() {',
'float side = abs(vV);', 'float side = abs(vV);',
'float wob = 0.48 + 0.42 * noise1(vU * 24.0);', 'float edgeNoise = fbm2(vec2(vU * 18.0, vV * 5.0));',
'float jag = noise1(vU * 61.0 + vV * 17.0) - 0.5;', 'float clumpNoise = fbm2(vec2(vU * 43.0 + 11.0, vV * 11.0 - 3.0));',
'float edge = 1.0 - smoothstep(wob * 0.16, wob, side + jag * 0.18);', 'float wob = 0.30 + 0.72 * edgeNoise;',
'edge *= 0.42 + 0.58 * pow(vU, 0.65);', 'float raggedSide = side + (clumpNoise - 0.5) * 0.42;',
'float dens = 0.58 + 0.42 * noise1(vU * 31.0);', 'float edge = 1.0 - smoothstep(wob * 0.10, wob, raggedSide);',
'float head = 0.32 + 0.68 * vU;', 'edge *= 0.32 + 0.68 * pow(vU, 0.55);',
'float a = clamp(vS * edge * head * dens, 0.0, 0.88);', 'float dens = fbm2(vec2(vU * 31.0 + vV * 2.0, vU * 7.0 - vV * 4.0));',
'if (a <= 0.004) discard;', 'dens = smoothstep(0.24, 0.86, dens);',
'vec3 dayCol = vec3(1.0, 1.0, 1.0);', 'float streak = 0.55 + 0.45 * noise2(vec2(vU * 90.0, vV * 2.0));',
'vec3 nightCol = vec3(0.45, 0.55, 0.75);', '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));', '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);', 'gl_FragColor = vec4(col, a);',
'}' '}'
].join('\n'); ].join('\n');