auto-git:

[change] src/rendering/world-background-renderer.ts
This commit is contained in:
2026-04-25 01:33:47 +02:00
parent cab109436e
commit 79f930c46e

View File

@@ -286,6 +286,15 @@ uniform vec3 uCloudTint;
uniform float uCloudOpacity;
uniform float uCloudOpacityRandomness;
uniform vec2 uCloudDriftOffset;
uniform float uAuroraVisibility;
uniform float uAuroraIntensity;
uniform float uAuroraHeight;
uniform float uAuroraThickness;
uniform float uAuroraSpeed;
uniform vec3 uAuroraPrimaryColor;
uniform vec3 uAuroraSecondaryColor;
uniform float uAuroraRotationRadians;
uniform float uAuroraTimeHours;
varying vec3 vWorldPosition;
float hash12(vec2 point) {
@@ -345,6 +354,13 @@ float fbm2(vec2 point) {
return value;
}
float auroraFilamentPattern(vec2 point, float timeShift) {
float broad = abs(sin(point.x * 18.0 + noise2(point * 0.45) * 4.0 + timeShift));
float fine = abs(sin(point.x * 54.0 - point.y * 7.0 + noise2(point * 1.35) * 5.5 + timeShift * 1.8));
return mix(pow(broad, 3.4), pow(fine, 5.6), 0.58);
}
mat3 rotationY(float radians) {
float sine = sin(radians);
float cosine = cos(radians);
@@ -490,6 +506,96 @@ void main() {
vec3 cloudColor = mix(cloudLight, uCloudTint, 0.56);
skyColor = mix(skyColor, cloudColor, clamp(clouds, 0.0, 1.0));
if (uAuroraVisibility > 0.001) {
vec3 auroraDirection = normalize(rotationY(uAuroraRotationRadians) * direction);
float auroraTime = uAuroraTimeHours * max(uAuroraSpeed, 0.0);
float hemisphereMask = smoothstep(-0.24, 0.42, auroraDirection.z);
vec2 auroraUv = vec2(
auroraDirection.x * 2.2 + auroraDirection.z * 0.35,
auroraDirection.z * 1.28
);
float arcNoise = fbm2(
auroraUv * 0.72 + vec2(auroraTime * 0.06, -auroraTime * 0.025)
);
float arcCenter =
uHorizonHeight +
mix(0.16, 0.82, clamp(uAuroraHeight, 0.0, 1.0)) +
(arcNoise - 0.5) * mix(0.1, 0.34, clamp(uAuroraThickness, 0.0, 1.0));
float curtainThickness = mix(0.09, 0.34, clamp(uAuroraThickness, 0.0, 1.0));
float curtainMask =
1.0 -
smoothstep(
curtainThickness,
curtainThickness + 0.1,
abs(direction.y - arcCenter)
);
float horizonFade = smoothstep(
uHorizonHeight - 0.02,
uHorizonHeight + 0.14,
direction.y
);
float topFade =
1.0 -
smoothstep(
arcCenter + curtainThickness * 1.45,
arcCenter + curtainThickness * 2.3,
direction.y
);
float sway = fbm2(
vec2(
auroraUv.x * 3.5 - auroraTime * 0.22,
auroraUv.y * 1.4 + auroraTime * 0.04
)
);
float sweep = fbm2(
vec2(
auroraUv.x * 6.4 + auroraTime * 0.15,
auroraUv.y * 2.8 - auroraTime * 0.03
)
);
float filamentPattern = auroraFilamentPattern(
vec2(auroraUv.x * 1.8, direction.y * 6.0 + auroraUv.y * 2.0),
auroraTime * 1.7
);
float skirt =
1.0 -
smoothstep(
arcCenter - curtainThickness * 1.8,
arcCenter - curtainThickness * 0.2,
direction.y
);
float auroraStrength =
curtainMask *
hemisphereMask *
horizonFade *
topFade *
(0.42 + sway * 0.78) *
mix(0.55, 1.25, filamentPattern) *
mix(0.76, 1.0, sweep) *
mix(0.62, 1.0, skirt);
float auroraGlow =
hemisphereMask *
horizonFade *
(1.0 -
smoothstep(
curtainThickness * 1.6,
curtainThickness * 3.0,
abs(direction.y - arcCenter)
)) *
(0.16 + sway * 0.32);
float auroraColorMix = clamp(0.18 + filamentPattern * 0.46 + sweep * 0.5, 0.0, 1.0);
vec3 auroraColor = mix(
uAuroraPrimaryColor,
uAuroraSecondaryColor,
auroraColorMix
);
auroraColor += vec3(0.82, 1.0, 0.9) * filamentPattern * 0.07;
skyColor +=
auroraColor *
(auroraStrength * uAuroraVisibility * uAuroraIntensity +
auroraGlow * uAuroraVisibility * uAuroraIntensity * 0.4);
}
skyColor +=
uSunColor *
(sunAtmosphere * (0.03 + uTwilightFactor * 0.18) +
@@ -696,6 +802,33 @@ function createShaderSkyMaterial() {
},
uCloudDriftOffset: {
value: new Vector2(0, 0)
},
uAuroraVisibility: {
value: 0
},
uAuroraIntensity: {
value: 1
},
uAuroraHeight: {
value: 0.66
},
uAuroraThickness: {
value: 0.42
},
uAuroraSpeed: {
value: 0.12
},
uAuroraPrimaryColor: {
value: new Color("#6df7d0")
},
uAuroraSecondaryColor: {
value: new Color("#6e8dff")
},
uAuroraRotationRadians: {
value: 0
},
uAuroraTimeHours: {
value: 0
}
},
vertexShader: GRADIENT_VERTEX_SHADER,
@@ -717,6 +850,7 @@ function applyShaderSkyStateToMaterial(
material.uniforms.uStarHorizonFadeOffset.value = 0;
material.uniforms.uSunVisible.value = 0;
material.uniforms.uMoonVisible.value = 0;
material.uniforms.uAuroraVisibility.value = 0;
return;
}
@@ -765,6 +899,20 @@ function applyShaderSkyStateToMaterial(
state.clouds.driftOffset.x,
state.clouds.driftOffset.y
);
material.uniforms.uAuroraVisibility.value = state.aurora.visibility;
material.uniforms.uAuroraIntensity.value = state.aurora.intensity;
material.uniforms.uAuroraHeight.value = state.aurora.height;
material.uniforms.uAuroraThickness.value = state.aurora.thickness;
material.uniforms.uAuroraSpeed.value = state.aurora.speed;
material.uniforms.uAuroraPrimaryColor.value.set(
state.aurora.primaryColorHex
);
material.uniforms.uAuroraSecondaryColor.value.set(
state.aurora.secondaryColorHex
);
material.uniforms.uAuroraRotationRadians.value =
state.aurora.rotationRadians;
material.uniforms.uAuroraTimeHours.value = state.aurora.timeHours;
}
export class WorldBackgroundRenderer {