diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 60c51d5..be0066d 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -719,8 +719,8 @@ var FRAG_SRC = [ 'float maxMarch = max(1.0, uCloudMaxMarch);', 'tExit = min(tExit, tEnter + maxMarch);', 'if (tExit <= tEnter) { gl_FragColor = vec4(0.0); return; }', - 'float stepSize = (tExit - tEnter) / 32.0;', - 'float t = tEnter + stepSize * 0.5;', + 'float marchCurve = 2.5;', + 'float marchDenom = 1.0 - exp(-marchCurve);', 'float coverage = clamp(uDensity, 0.0, 1.0);', 'float baseThresh = mix(0.62, 0.20, coverage);', 'float densityGain = mix(0.45, 1.0, coverage);', @@ -730,6 +730,12 @@ var FRAG_SRC = [ 'float trans = 1.0;', 'vec3 cloudSum = vec3(0.0);', '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;', '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);', @@ -751,7 +757,6 @@ var FRAG_SRC = [ 'trans *= (1.0 - alpha);', 'if (trans < 0.04) break;', '}', - 't += stepSize;', '}', 'float cloudAlpha = 1.0 - trans;', 'vec3 cloudColor = (cloudAlpha > 0.001) ? cloudSum / cloudAlpha : vec3(0.0);',