atmosphere: cap haze alpha to avoid hard horizon cut

This commit is contained in:
Richard Zink committed 2026-10-12 16:35:57 +02:00
1 parent 69a00b479b
commit 98e69da3b2
2 files changed
+14 -4

No files matched your search

+3 -2
View File
@@ -320,9 +320,10 @@ window.CONFIG = {
enabled: true, enabled: true,
heightKm: 60, heightKm: 60,
scaleHeightKm: 8.5, scaleHeightKm: 8.5,
density: 0.25, density: 0.18,
grayTau: 1.2, grayTau: 1.2,
gain: 1.0 gain: 1.0,
maxAlpha: 0.55
}, },
model: { model: {
enabled: false // legacy full atmosphere model remains off enabled: false // legacy full atmosphere model remains off
+11 -2
View File
@@ -92,6 +92,7 @@ var FRAG_SRC = [
'uniform float uAtmoDensity;', 'uniform float uAtmoDensity;',
'uniform float uAtmoGrayTau;', 'uniform float uAtmoGrayTau;',
'uniform float uAtmoGain;', 'uniform float uAtmoGain;',
'uniform float uAtmoMaxAlpha;',
'uniform float uEarthRadius;', 'uniform float uEarthRadius;',
'uniform float uCurvatureOn;', 'uniform float uCurvatureOn;',
'uniform vec3 uCamPos;', 'uniform vec3 uCamPos;',
@@ -374,8 +375,9 @@ var FRAG_SRC = [
'tau += dtau;', 'tau += dtau;',
't += step;', 't += step;',
'}', '}',
'float alpha = clamp(1.0 - exp(-tau), 0.0, 1.0);', 'float rawAlpha = clamp(1.0 - exp(-tau), 0.0, 1.0);',
'vec3 col = scatter / max(alpha, 1e-4) * uAtmoGain;', 'float alpha = clamp(rawAlpha * uAtmoGain, 0.0, uAtmoMaxAlpha);',
'vec3 col = scatter / max(rawAlpha, 1e-4);',
'gl_FragColor = vec4(col, alpha);', 'gl_FragColor = vec4(col, alpha);',
'return;', 'return;',
'}', '}',
@@ -859,6 +861,7 @@ function init(canvas) {
var uAtmoDensity = gl.getUniformLocation(prog, 'uAtmoDensity'); var uAtmoDensity = gl.getUniformLocation(prog, 'uAtmoDensity');
var uAtmoGrayTau = gl.getUniformLocation(prog, 'uAtmoGrayTau'); var uAtmoGrayTau = gl.getUniformLocation(prog, 'uAtmoGrayTau');
var uAtmoGain = gl.getUniformLocation(prog, 'uAtmoGain'); var uAtmoGain = gl.getUniformLocation(prog, 'uAtmoGain');
var uAtmoMaxAlpha = gl.getUniformLocation(prog, 'uAtmoMaxAlpha');
var uEarthRadius = gl.getUniformLocation(prog, 'uEarthRadius'); var uEarthRadius = gl.getUniformLocation(prog, 'uEarthRadius');
var uCurvatureOn = gl.getUniformLocation(prog, 'uCurvatureOn'); var uCurvatureOn = gl.getUniformLocation(prog, 'uCurvatureOn');
var uCamPos = gl.getUniformLocation(prog, 'uCamPos'); var uCamPos = gl.getUniformLocation(prog, 'uCamPos');
@@ -982,6 +985,7 @@ function init(canvas) {
uAtmoModelOn: uAtmoModelOn, uAtmoHeightUnits: uAtmoHeightUnits, uAtmoModelOn: uAtmoModelOn, uAtmoHeightUnits: uAtmoHeightUnits,
uAtmoScaleHeightUnits: uAtmoScaleHeightUnits, uAtmoDensity: uAtmoDensity, uAtmoScaleHeightUnits: uAtmoScaleHeightUnits, uAtmoDensity: uAtmoDensity,
uAtmoGrayTau: uAtmoGrayTau, uAtmoGain: uAtmoGain, uAtmoGrayTau: uAtmoGrayTau, uAtmoGain: uAtmoGain,
uAtmoMaxAlpha: uAtmoMaxAlpha,
uEarthRadius: uEarthRadius, uEarthRadius: uEarthRadius,
uCurvatureOn: uCurvatureOn, uCamPos: uCamPos, uCurvatureOn: uCurvatureOn, uCamPos: uCamPos,
uAtmoBlueColor: uAtmoBlueColor, uAtmoGrayColor: uAtmoGrayColor, 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)) ? Math.max(0.1, Math.min(5.0, HAZE_CFG.gain))
: ((typeof ATMO_MODEL.gain === 'number') : ((typeof ATMO_MODEL.gain === 'number')
? Math.max(0.1, Math.min(5.0, ATMO_MODEL.gain)) : 1.0); ? 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 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')
@@ -5556,6 +5564,7 @@ window.clouds3dRender = function(target) {
gl.uniform1f(s.uAtmoDensity, ATMO_MODEL_DENSITY); gl.uniform1f(s.uAtmoDensity, ATMO_MODEL_DENSITY);
gl.uniform1f(s.uAtmoGrayTau, ATMO_MODEL_GRAY_TAU); gl.uniform1f(s.uAtmoGrayTau, ATMO_MODEL_GRAY_TAU);
gl.uniform1f(s.uAtmoGain, ATMO_MODEL_GAIN); gl.uniform1f(s.uAtmoGain, ATMO_MODEL_GAIN);
gl.uniform1f(s.uAtmoMaxAlpha, ATMO_MODEL_MAX_ALPHA);
gl.uniform1f(s.uEarthRadius, EARTH_RADIUS_UNITS); gl.uniform1f(s.uEarthRadius, EARTH_RADIUS_UNITS);
gl.uniform3fv(s.uAtmoBlueColor, ATMO_MODEL_BLUE_COLOR); gl.uniform3fv(s.uAtmoBlueColor, ATMO_MODEL_BLUE_COLOR);
gl.uniform3fv(s.uAtmoGrayColor, ATMO_MODEL_GRAY_COLOR); gl.uniform3fv(s.uAtmoGrayColor, ATMO_MODEL_GRAY_COLOR);