From 98e69da3b29aaccf897ffc4e150136865eced37b Mon Sep 17 00:00:00 2001 From: Richard Zink Date: Mon, 12 Oct 2026 16:35:57 +0200 Subject: [PATCH] atmosphere: cap haze alpha to avoid hard horizon cut --- config.js | 5 +++-- vendor/clouds3d.js | 13 +++++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/config.js b/config.js index 08ff298..e793223 100644 --- a/config.js +++ b/config.js @@ -320,9 +320,10 @@ window.CONFIG = { enabled: true, heightKm: 60, scaleHeightKm: 8.5, - density: 0.25, + density: 0.18, grayTau: 1.2, - gain: 1.0 + gain: 1.0, + maxAlpha: 0.55 }, model: { enabled: false // legacy full atmosphere model remains off diff --git a/vendor/clouds3d.js b/vendor/clouds3d.js index 39de683..ced988e 100644 --- a/vendor/clouds3d.js +++ b/vendor/clouds3d.js @@ -92,6 +92,7 @@ var FRAG_SRC = [ 'uniform float uAtmoDensity;', 'uniform float uAtmoGrayTau;', 'uniform float uAtmoGain;', + 'uniform float uAtmoMaxAlpha;', 'uniform float uEarthRadius;', 'uniform float uCurvatureOn;', 'uniform vec3 uCamPos;', @@ -374,8 +375,9 @@ var FRAG_SRC = [ 'tau += dtau;', 't += step;', '}', - 'float alpha = clamp(1.0 - exp(-tau), 0.0, 1.0);', - 'vec3 col = scatter / max(alpha, 1e-4) * uAtmoGain;', + 'float rawAlpha = clamp(1.0 - exp(-tau), 0.0, 1.0);', + 'float alpha = clamp(rawAlpha * uAtmoGain, 0.0, uAtmoMaxAlpha);', + 'vec3 col = scatter / max(rawAlpha, 1e-4);', 'gl_FragColor = vec4(col, alpha);', 'return;', '}', @@ -859,6 +861,7 @@ function init(canvas) { var uAtmoDensity = gl.getUniformLocation(prog, 'uAtmoDensity'); var uAtmoGrayTau = gl.getUniformLocation(prog, 'uAtmoGrayTau'); var uAtmoGain = gl.getUniformLocation(prog, 'uAtmoGain'); + var uAtmoMaxAlpha = gl.getUniformLocation(prog, 'uAtmoMaxAlpha'); var uEarthRadius = gl.getUniformLocation(prog, 'uEarthRadius'); var uCurvatureOn = gl.getUniformLocation(prog, 'uCurvatureOn'); var uCamPos = gl.getUniformLocation(prog, 'uCamPos'); @@ -982,6 +985,7 @@ function init(canvas) { uAtmoModelOn: uAtmoModelOn, uAtmoHeightUnits: uAtmoHeightUnits, uAtmoScaleHeightUnits: uAtmoScaleHeightUnits, uAtmoDensity: uAtmoDensity, uAtmoGrayTau: uAtmoGrayTau, uAtmoGain: uAtmoGain, + uAtmoMaxAlpha: uAtmoMaxAlpha, uEarthRadius: uEarthRadius, uCurvatureOn: uCurvatureOn, uCamPos: uCamPos, uAtmoBlueColor: uAtmoBlueColor, uAtmoGrayColor: uAtmoGrayColor, @@ -2453,6 +2457,10 @@ 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 ATMO_MODEL_MAX_ALPHA = (typeof HAZE_CFG.maxAlpha === 'number') + ? Math.max(0.05, Math.min(1.0, HAZE_CFG.maxAlpha)) + : ((typeof ATMO_MODEL.maxAlpha === 'number') + ? Math.max(0.05, Math.min(1.0, ATMO_MODEL.maxAlpha)) : 0.55); var CURV_CFG = (window.CONFIG && window.CONFIG.curvature) || {}; var CURVATURE_ON = CURV_CFG.enabled !== false; var CURV_EXAG = (typeof CURV_CFG.exaggeration === 'number') @@ -5556,6 +5564,7 @@ window.clouds3dRender = function(target) { gl.uniform1f(s.uAtmoDensity, ATMO_MODEL_DENSITY); gl.uniform1f(s.uAtmoGrayTau, ATMO_MODEL_GRAY_TAU); gl.uniform1f(s.uAtmoGain, ATMO_MODEL_GAIN); + gl.uniform1f(s.uAtmoMaxAlpha, ATMO_MODEL_MAX_ALPHA); gl.uniform1f(s.uEarthRadius, EARTH_RADIUS_UNITS); gl.uniform3fv(s.uAtmoBlueColor, ATMO_MODEL_BLUE_COLOR); gl.uniform3fv(s.uAtmoGrayColor, ATMO_MODEL_GRAY_COLOR);