perf: distance-adaptive cloud raymarch

This commit is contained in:
Richard Zink committed 2026-10-13 21:33:29 +02:00
1 parent e14f938252
commit 06ad6db900
1 file changed
+8 -3
+8 -3
View File
@@ -719,8 +719,8 @@ var FRAG_SRC = [
'float maxMarch = max(1.0, uCloudMaxMarch);', 'float maxMarch = max(1.0, uCloudMaxMarch);',
'tExit = min(tExit, tEnter + maxMarch);', 'tExit = min(tExit, tEnter + maxMarch);',
'if (tExit <= tEnter) { gl_FragColor = vec4(0.0); return; }', 'if (tExit <= tEnter) { gl_FragColor = vec4(0.0); return; }',
'float stepSize = (tExit - tEnter) / 32.0;', 'float marchCurve = 2.5;',
'float t = tEnter + stepSize * 0.5;', 'float marchDenom = 1.0 - exp(-marchCurve);',
'float coverage = clamp(uDensity, 0.0, 1.0);', 'float coverage = clamp(uDensity, 0.0, 1.0);',
'float baseThresh = mix(0.62, 0.20, coverage);', 'float baseThresh = mix(0.62, 0.20, coverage);',
'float densityGain = mix(0.45, 1.0, coverage);', 'float densityGain = mix(0.45, 1.0, coverage);',
@@ -730,6 +730,12 @@ var FRAG_SRC = [
'float trans = 1.0;', 'float trans = 1.0;',
'vec3 cloudSum = vec3(0.0);', 'vec3 cloudSum = vec3(0.0);',
'for (int i = 0; i < 32; i++) {', 'for (int i = 0; i < 32; i++) {',
'float u = (float(i) + 0.5) / 32.0;',
'float uNext = (float(i) + 1.5) / 32.0;',
'float mapU = (1.0 - exp(-marchCurve * u)) / marchDenom;',
'float mapUNext = (1.0 - exp(-marchCurve * uNext)) / marchDenom;',
'float t = tEnter + (tExit - tEnter) * mapU;',
'float stepSize = (tExit - tEnter) * (mapUNext - mapU);',
'vec3 p = uCamPos + rd * t;', 'vec3 p = uCamPos + rd * t;',
'p += rd * (ign(gl_FragCoord.xy + vec2(float(i) * 7.13, float(i) * 3.71)) - 0.5) * stepSize * 0.25;', 'p += rd * (ign(gl_FragCoord.xy + vec2(float(i) * 7.13, float(i) * 3.71)) - 0.5) * stepSize * 0.25;',
'float alt = p.y + earthDrop(p.xz);', 'float alt = p.y + earthDrop(p.xz);',
@@ -751,7 +757,6 @@ var FRAG_SRC = [
'trans *= (1.0 - alpha);', 'trans *= (1.0 - alpha);',
'if (trans < 0.04) break;', 'if (trans < 0.04) break;',
'}', '}',
't += stepSize;',
'}', '}',
'float cloudAlpha = 1.0 - trans;', 'float cloudAlpha = 1.0 - trans;',
'vec3 cloudColor = (cloudAlpha > 0.001) ? cloudSum / cloudAlpha : vec3(0.0);', 'vec3 cloudColor = (cloudAlpha > 0.001) ? cloudSum / cloudAlpha : vec3(0.0);',