clouds: use real terrain height for cloud occlusion

This commit is contained in:
Richard Zink committed 2026-10-12 18:32:53 +02:00
1 parent 3cc741e86f
commit 20af6dcdd5
1 file changed
+5 -2
+5 -2
View File
@@ -79,6 +79,7 @@ var FRAG_SRC = [
'uniform sampler2D uElev;', // terrarium RGB height grid, same UV as uGround 'uniform sampler2D uElev;', // terrarium RGB height grid, same UV as uGround
'uniform float uElevOn;', // terrain enabled (0/1) 'uniform float uElevOn;', // terrain enabled (0/1)
'uniform float uElevScale;', // metres -> world units (incl. exaggeration) 'uniform float uElevScale;', // metres -> world units (incl. exaggeration)
'uniform float uTerrainExag;', // terrain vertical exaggeration
'uniform vec3 uSunDir;', // unit vector towards the sun (world X,Y,Z) 'uniform vec3 uSunDir;', // unit vector towards the sun (world X,Y,Z)
'uniform vec3 uMoonDir;', // unit vector towards the moon (world X,Y,Z) 'uniform vec3 uMoonDir;', // unit vector towards the moon (world X,Y,Z)
'uniform sampler2D uSkyTex;', // baked star catalogue + Milky Way (equirect) 'uniform sampler2D uSkyTex;', // baked star catalogue + Milky Way (equirect)
@@ -675,7 +676,7 @@ var FRAG_SRC = [
'float distNorm = (distTex.r * 65536.0 + distTex.g * 256.0 + distTex.b) / 16777215.0;', 'float distNorm = (distTex.r * 65536.0 + distTex.g * 256.0 + distTex.b) / 16777215.0;',
'float dist = distNorm * max(1.0, uFarPlane);', 'float dist = distNorm * max(1.0, uFarPlane);',
'vec3 pT = uCamPos + rd * dist;', 'vec3 pT = uCamPos + rd * dist;',
'float terrainAlt = pT.y + earthDrop(pT.xz);', 'float terrainAlt = (pT.y + earthDrop(pT.xz)) / max(1.0, uTerrainExag);',
'if (terrainAlt > uCloudTop + 0.05) { gl_FragColor = vec4(0.0); return; }', 'if (terrainAlt > uCloudTop + 0.05) { gl_FragColor = vec4(0.0); return; }',
'}', '}',
'}', '}',
@@ -1103,6 +1104,7 @@ function init(canvas) {
var uElev = gl.getUniformLocation(prog, 'uElev'); var uElev = gl.getUniformLocation(prog, 'uElev');
var uElevOn = gl.getUniformLocation(prog, 'uElevOn'); var uElevOn = gl.getUniformLocation(prog, 'uElevOn');
var uElevScale = gl.getUniformLocation(prog, 'uElevScale'); var uElevScale = gl.getUniformLocation(prog, 'uElevScale');
var uTerrainExag = gl.getUniformLocation(prog, 'uTerrainExag');
var uSunDir = gl.getUniformLocation(prog, 'uSunDir'); var uSunDir = gl.getUniformLocation(prog, 'uSunDir');
var uMoonDir = gl.getUniformLocation(prog, 'uMoonDir'); var uMoonDir = gl.getUniformLocation(prog, 'uMoonDir');
var uMode = gl.getUniformLocation(prog, 'uMode'); var uMode = gl.getUniformLocation(prog, 'uMode');
@@ -1255,7 +1257,7 @@ function init(canvas) {
uSpeed: uSpeed, uDensity: uDensity, uDayProgress: uDayProgress, uSpeed: uSpeed, uDensity: uDensity, uDayProgress: uDayProgress,
uSunAlt: uSunAlt, uSunAlt: uSunAlt,
uCloudTop: uCloudTop, uCloudBot: uCloudBot, uCloudTop: uCloudTop, uCloudBot: uCloudBot,
uElev: uElev, uElevOn: uElevOn, uElevScale: uElevScale, uElev: uElev, uElevOn: uElevOn, uElevScale: uElevScale, uTerrainExag: uTerrainExag,
uSunDir: uSunDir, uMoonDir: uMoonDir, uMode: uMode, uSunDir: uSunDir, uMoonDir: uMoonDir, uMode: uMode,
uAtmoModelOn: uAtmoModelOn, uAtmoHeightUnits: uAtmoHeightUnits, uAtmoModelOn: uAtmoModelOn, uAtmoHeightUnits: uAtmoHeightUnits,
uAtmoScaleHeightUnits: uAtmoScaleHeightUnits, uAtmoDensity: uAtmoDensity, uAtmoScaleHeightUnits: uAtmoScaleHeightUnits, uAtmoDensity: uAtmoDensity,
@@ -5834,6 +5836,7 @@ window.clouds3dRender = function(target) {
gl.uniform1i(s.uElev, 2); gl.uniform1i(s.uElev, 2);
gl.uniform1f(s.uElevOn, (elevTexture && TERRAIN_ON > 0.5) ? 1.0 : 0.0); gl.uniform1f(s.uElevOn, (elevTexture && TERRAIN_ON > 0.5) ? 1.0 : 0.0);
gl.uniform1f(s.uElevScale, ELEV_SCALE_UNITS); gl.uniform1f(s.uElevScale, ELEV_SCALE_UNITS);
gl.uniform1f(s.uTerrainExag, TERRAIN_EXAG);
var sd = window.__currentSunDir || [0, 0.7, 0.7]; var sd = window.__currentSunDir || [0, 0.7, 0.7];
gl.uniform3f(s.uSunDir, sd[0], sd[1], sd[2]); gl.uniform3f(s.uSunDir, sd[0], sd[1], sd[2]);
var md = window.__currentMoonDir || sd; var md = window.__currentMoonDir || sd;