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 physicalSky: true, // Rayleigh sky scattering instead of pure theme gradient
rayleighGain: 8.0, // exposure for the physical sky term rayleighGain: 8.0, // exposure for the physical sky term
distanceFog: false, // legacy aerial perspective is off 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: { 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 hazeResidual: 0.30, // surface colour surviving at the full fog distance
cloudBrightness: 1.0, // cloud albedo (theme hue, brightness from the model) 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++) {', 'for (int i = 0; i < 32; i++) {',
'vec3 p = ro + rd * t;', 'vec3 p = ro + rd * t;',
'float alt = max(0.0, length(p - C) - R);', '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 dtau = uAtmoDensity * dens * step;',
'float transBefore = exp(-tau);', 'float transBefore = exp(-tau);',
'float grayMix = clamp(tau / max(0.01, uAtmoGrayTau), 0.0, 1.0);', '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; ? Math.max(0.02, Math.min(0.95, ATMO.hazeResidual)) : 0.30;
var ATMO_DISTANCE_FOG = ATMO.distanceFog !== false; var ATMO_DISTANCE_FOG = ATMO.distanceFog !== false;
var ATMO_MODEL = ATMO.model || {}; var ATMO_MODEL = ATMO.model || {};
var ATMO_MODEL_ON = ATMO_MODEL.enabled === true; var HAZE_CFG = ATMO.haze || {};
var ATMO_MODEL_HEIGHT_KM = (typeof ATMO_MODEL.heightKm === 'number') var ATMO_MODEL_ON = (typeof HAZE_CFG.enabled === 'boolean')
? Math.max(1.0, Math.min(80.0, ATMO_MODEL.heightKm)) : 35.0; ? 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_HEIGHT_UNITS = ATMO_MODEL_HEIGHT_KM / KM_PER_TILE;
var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof ATMO_MODEL.scaleHeightKm === 'number') var ATMO_MODEL_SCALE_HEIGHT_KM = (typeof HAZE_CFG.scaleHeightKm === 'number')
? Math.max(1.0, Math.min(30.0, ATMO_MODEL.scaleHeightKm)) : 8.5; ? 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_SCALE_HEIGHT_UNITS = ATMO_MODEL_SCALE_HEIGHT_KM / KM_PER_TILE;
var ATMO_MODEL_DENSITY = (typeof ATMO_MODEL.density === 'number') var ATMO_MODEL_DENSITY = (typeof HAZE_CFG.density === 'number')
? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.12; ? Math.max(0.01, Math.min(5.0, HAZE_CFG.density))
var ATMO_MODEL_GRAY_TAU = (typeof ATMO_MODEL.grayTau === 'number') : ((typeof ATMO_MODEL.density === 'number')
? Math.max(0.1, Math.min(10.0, ATMO_MODEL.grayTau)) : 1.5; ? Math.max(0.01, Math.min(5.0, ATMO_MODEL.density)) : 0.25);
var ATMO_MODEL_GAIN = (typeof ATMO_MODEL.gain === 'number') var ATMO_MODEL_GRAY_TAU = (typeof HAZE_CFG.grayTau === 'number')
? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 2.0; ? 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 CURV_CFG = (window.CONFIG && window.CONFIG.curvature) || {};
var CURVATURE_ON = CURV_CFG.enabled !== false; var CURVATURE_ON = CURV_CFG.enabled !== false;
var CURV_EXAG = (typeof CURV_CFG.exaggeration === 'number') var CURV_EXAG = (typeof CURV_CFG.exaggeration === 'number')
@@ -6364,6 +6377,14 @@ window.clouds3dRender = function(target) {
} }
if (ATMO_MODEL_ON) { 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.uniform1i(s.uMode, 2);
gl.drawArrays(gl.TRIANGLES, 0, 3); gl.drawArrays(gl.TRIANGLES, 0, 3);
} }