atmosphere: add altitude-thinning distance haze

This commit is contained in:
Richard Zink committed 2026-10-12 16:24:11 +02:00
1 parent 7d75707e74
commit 69a00b479b
2 files changed
+42 -13

No files matched your search

+9 -1
View File
@@ -316,8 +316,16 @@ window.CONFIG = {
physicalSky: true, // Rayleigh sky scattering instead of pure theme gradient
rayleighGain: 8.0, // exposure for the physical sky term
distanceFog: false, // legacy aerial perspective is off
haze: {
enabled: true,
heightKm: 60,
scaleHeightKm: 8.5,
density: 0.25,
grayTau: 1.2,
gain: 1.0
},
model: {
enabled: false // volumetric atmosphere/fog removed
enabled: false // legacy full atmosphere model remains off
},
hazeResidual: 0.30, // surface colour surviving at the full fog distance
cloudBrightness: 1.0, // cloud albedo (theme hue, brightness from the model)
+33 -12
View File
@@ -364,7 +364,7 @@ var FRAG_SRC = [
'for (int i = 0; i < 32; i++) {',
'vec3 p = ro + rd * t;',
'float alt = max(0.0, length(p - C) - R);',
'float dens = exp(-alt / Hs);',
'float dens = exp(-alt / Hs) / Hs;',
'float dtau = uAtmoDensity * dens * step;',
'float transBefore = exp(-tau);',
'float grayMix = clamp(tau / max(0.01, uAtmoGrayTau), 0.0, 1.0);',
@@ -2427,19 +2427,32 @@ var ATMO_HAZE_RESIDUAL = (typeof ATMO.hazeResidual === 'number')
? Math.max(0.02, Math.min(0.95, ATMO.hazeResidual)) : 0.30;
var ATMO_DISTANCE_FOG = ATMO.distanceFog !== false;
var ATMO_MODEL = ATMO.model || {};
var ATMO_MODEL_ON = ATMO_MODEL.enabled === true;
var ATMO_MODEL_HEIGHT_KM = (typeof ATMO_MODEL.heightKm === 'number')
? Math.max(1.0, Math.min(80.0, ATMO_MODEL.heightKm)) : 35.0;
var HAZE_CFG = ATMO.haze || {};
var ATMO_MODEL_ON = (typeof HAZE_CFG.enabled === 'boolean')
? HAZE_CFG.enabled
: (ATMO_MODEL.enabled === true);
var ATMO_MODEL_HEIGHT_KM = (typeof HAZE_CFG.heightKm === 'number')
? Math.max(1.0, Math.min(120.0, HAZE_CFG.heightKm))
: ((typeof ATMO_MODEL.heightKm === 'number')
? Math.max(1.0, Math.min(80.0, ATMO_MODEL.heightKm)) : 60.0);
var ATMO_MODEL_HEIGHT_UNITS = ATMO_MODEL_HEIGHT_KM / KM_PER_TILE;
var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof ATMO_MODEL.scaleHeightKm === 'number')
? Math.max(1.0, Math.min(30.0, ATMO_MODEL.scaleHeightKm)) : 8.5;
var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof HAZE_CFG.scaleHeightKm === 'number')
? Math.max(1.0, Math.min(30.0, HAZE_CFG.scaleHeightKm))
: ((typeof ATMO_MODEL.scaleHeightKm === 'number')
? Math.max(1.0, Math.min(30.0, ATMO_MODEL.scaleHeightKm)) : 8.5);
var ATMO_MODEL_SCALE_HEIGHT_UNITS = ATMO_MODEL_SCALE_HEIGHT_KM / KM_PER_TILE;
var ATMO_MODEL_DENSITY = (typeof ATMO_MODEL.density === 'number')
? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.12;
var ATMO_MODEL_GRAY_TAU = (typeof ATMO_MODEL.grayTau === 'number')
? Math.max(0.1, Math.min(10.0, ATMO_MODEL.grayTau)) : 1.5;
var ATMO_MODEL_GAIN = (typeof ATMO_MODEL.gain === 'number')
? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 2.0;
var ATMO_MODEL_DENSITY = (typeof HAZE_CFG.density === 'number')
? Math.max(0.01, Math.min(5.0, HAZE_CFG.density))
: ((typeof ATMO_MODEL.density === 'number')
? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.25);
var ATMO_MODEL_GRAY_TAU = (typeof HAZE_CFG.grayTau === 'number')
? Math.max(0.1, Math.min(10.0, HAZE_CFG.grayTau))
: ((typeof ATMO_MODEL.grayTau === 'number')
? Math.max(0.1, Math.min(10.0, ATMO_MODEL.grayTau)) : 1.2);
var ATMO_MODEL_GAIN = (typeof HAZE_CFG.gain === 'number')
? Math.max(0.1, Math.min(5.0, HAZE_CFG.gain))
: ((typeof ATMO_MODEL.gain === 'number')
? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 1.0);
var CURV_CFG = (window.CONFIG && window.CONFIG.curvature) || {};
var CURVATURE_ON = CURV_CFG.enabled !== false;
var CURV_EXAG = (typeof CURV_CFG.exaggeration === 'number')
@@ -6364,6 +6377,14 @@ window.clouds3dRender = function(target) {
}
if (ATMO_MODEL_ON) {
gl.useProgram(s.prog);
gl.bindBuffer(gl.ARRAY_BUFFER, s.buf);
gl.enableVertexAttribArray(s.aPos);
gl.vertexAttribPointer(s.aPos, 2, gl.FLOAT, false, 0, 0);
gl.disable(gl.DEPTH_TEST);
gl.depthMask(false);
gl.enable(gl.BLEND);
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
gl.uniform1i(s.uMode, 2);
gl.drawArrays(gl.TRIANGLES, 0, 3);
}