Weiter am Wettersystem gearbeitet, ordentliche Wolken und Regen etc ergänzt

This commit is contained in:
2026-07-24 11:41:05 +02:00
parent 5a7d9897e4
commit 919f70bb44
47 changed files with 1665 additions and 1073 deletions

View File

@@ -5,6 +5,7 @@ uniform sampler2D m_DiffuseMap;
uniform bool m_HasDiffuseMap;
uniform sampler2D m_NormalMap;
uniform bool m_HasNormalMap;
uniform float m_Wetness;
in vec2 texCoord;
in vec3 vNormal;
@@ -38,5 +39,7 @@ void main() {
diff = max(diff, max(0.0, dot(-N, sun)) * 0.5);
float lit = 0.45 + diff * 0.55;
gl_FragColor = vec4(baseColor * lit, 1.0);
baseColor *= (1.0 - 0.18 * m_Wetness);
float shine = pow(diff, 12.0) * m_Wetness * 0.25;
gl_FragColor = vec4(baseColor * lit + vec3(shine), 1.0);
}

View File

@@ -1,7 +1,8 @@
uniform vec4 m_Color;
uniform vec3 m_SunDir;
uniform vec4 m_SunColor;
uniform vec4 g_AmbientLightColor;
uniform vec4 m_Color;
uniform vec3 m_SunDir;
uniform vec4 m_SunColor;
uniform vec4 g_AmbientLightColor;
uniform float m_Wetness;
#ifdef HAS_COLORMAP
uniform sampler2D m_ColorMap;
@@ -35,7 +36,8 @@ void main() {
// Beleuchtung: Sonne (two-sided via abs für Grashalme) + Ambient
float diffuse = abs(dot(n, normalize(m_SunDir)));
vec3 lit = g_AmbientLightColor.rgb + m_SunColor.rgb * diffuse;
color.rgb *= (1.0 - 0.18 * m_Wetness);
color.rgb *= lit;
outFragColor = color;
float shine = pow(diffuse, 12.0) * m_Wetness * 0.25;
outFragColor = vec4(color.rgb + vec3(shine), color.a);
}

View File

@@ -4,6 +4,7 @@ uniform float g_Time;
uniform float m_WindSpeed;
uniform float m_WindStrength;
uniform vec2 m_WindDir;
in vec3 inPosition;
in vec2 inTexCoord;
@@ -26,17 +27,20 @@ void main() {
vec2 worldXZ = (g_WorldMatrix * pos).xz;
float t = g_Time * m_WindSpeed;
vec2 windN = (dot(m_WindDir, m_WindDir) > 0.001) ? normalize(m_WindDir) : vec2(0.0, 1.0);
float wavePhase = dot(worldXZ, windN);
// Zwei überlagerte Sinuswellen für organische Bewegung
float sway = sin(t * 2.1 + worldXZ.x * 0.08 + worldXZ.y * 0.06) * 0.6
+ sin(t * 1.4 - worldXZ.x * 0.05 + worldXZ.y * 0.09) * 0.4;
float sway = sin(t * 2.1 + wavePhase * 0.08) * 0.6
+ sin(t * 1.4 + wavePhase * 0.06) * 0.4;
// Mindest-Stärke damit bei wenig Wind noch Bewegung sichtbar ist
float effectiveStrength = max(m_WindStrength, 0.05);
// Quadratische Gewichtung: Spitze bewegt sich mehr als Basis
float bend = sway * effectiveStrength * inTexCoord.y * inTexCoord.y;
pos.x += bend;
pos.z += bend * 0.3;
pos.x += windN.x * bend;
pos.z += windN.y * bend;
// Y-Kompression: Halm neigt sich statt zu strecken → verhindert visuelles Breiterwerden
pos.y -= bend * bend * 0.5;
}

View File

@@ -2,6 +2,7 @@ uniform sampler2D m_ColorMap;
uniform vec4 g_AmbientLightColor;
uniform vec3 m_SunDir;
uniform vec4 m_SunColor;
uniform float m_Wetness;
in vec2 varUV;
@@ -14,6 +15,7 @@ void main() {
// Wrapped diffuse kein Normalvektor nötig für Billboard-Quads
float light = 0.5 + 0.5 * max(dot(m_SunDir, vec3(0.0, 1.0, 0.0)), 0.0);
vec3 ambient = g_AmbientLightColor.rgb * c.rgb;
vec3 diffuse = m_SunColor.rgb * c.rgb * light;
outFragColor = vec4(min(ambient + diffuse, c.rgb * 1.5), c.a);
vec3 diffuse = m_SunColor.rgb * c.rgb * (1.0 - 0.18 * m_Wetness) * light;
float shine = pow(light, 12.0) * m_Wetness * 0.25;
outFragColor = vec4(min(ambient + diffuse, c.rgb * 1.5) + vec3(shine), c.a);
}

View File

@@ -1,7 +1,8 @@
uniform vec4 g_AmbientLightColor;
uniform vec4 g_AmbientLightColor;
uniform vec3 m_SunDir; // Richtung von der Fläche zur Sonne (world-space, normiert)
uniform vec4 m_SunColor; // Sonnenfarbe RGB
uniform vec3 m_SunDir; // Richtung von der Fläche zur Sonne (world-space, normiert)
uniform vec4 m_SunColor; // Sonnenfarbe RGB
uniform float m_Wetness;
in vec4 varColor;
in vec3 varNormal;
@@ -23,12 +24,13 @@ void main() {
float light = nDotL + sss;
vec3 ambient = g_AmbientLightColor.rgb * varColor.rgb;
vec3 diffuse = m_SunColor.rgb * varColor.rgb * light;
vec3 col = varColor.rgb * (1.0 - 0.18 * m_Wetness);
vec3 ambient = g_AmbientLightColor.rgb * col;
vec3 diffuse = m_SunColor.rgb * col * light;
// Farbe nicht über die Vertex-Color-Helligkeit hinaus aufhellen
vec3 result = ambient + diffuse;
result = min(result, varColor.rgb * 1.5);
outFragColor = vec4(result, 1.0);
result = min(result, col * 1.5);
float shine = pow(max(nDotL, 0.0), 12.0) * m_Wetness * 0.25;
outFragColor = vec4(result + vec3(shine), 1.0);
}

View File

@@ -16,9 +16,11 @@ uniform sampler2D m_AlphaMap_2;
uniform sampler2DArray m_NormalArray;
#endif
uniform vec3 m_LightDir;
uniform vec3 m_SunColor;
uniform vec3 m_AmbientColor;
uniform vec3 m_LightDir;
uniform vec3 m_SunColor;
uniform vec3 m_AmbientColor;
uniform float m_Wetness;
uniform vec3 g_CameraPosition;
in vec2 vSplatUV;
in vec3 vWorldPos;
@@ -106,14 +108,20 @@ void main() {
N = normalize(pertN);
#endif
vec3 lightDir = normalize(m_LightDir);
float diff = max(dot(N, lightDir), 0.0);
vec3 light = m_AmbientColor + m_SunColor * diff;
vec3 lightDir = normalize(m_LightDir);
float diff = max(dot(N, lightDir), 0.0);
vec3 light = m_AmbientColor + m_SunColor * diff;
// Nass-Effekt: Oberfläche abdunkeln + Blinn-Phong Specular Schimmer
col.rgb *= (1.0 - 0.20 * m_Wetness);
vec3 viewDir = normalize(g_CameraPosition - vWorldPos);
vec3 H = normalize(lightDir + viewDir);
float spec = pow(max(dot(N, H), 0.0), 80.0) * m_Wetness;
const float BRIGHTNESS = 0.80;
#ifdef DEBUG_NO_LIGHT
outColor = vec4(col.rgb * BRIGHTNESS, col.a);
#else
outColor = vec4(col.rgb * light * BRIGHTNESS, col.a);
outColor = vec4(col.rgb * light * BRIGHTNESS + vec3(spec * 0.35), col.a);
#endif
}

View File

@@ -6,6 +6,7 @@ uniform bool m_HasBarkMap;
uniform vec3 m_LightDir;
uniform vec3 m_SunColor;
uniform vec3 m_AmbientColor;
uniform float m_Wetness;
in vec2 texCoord;
in vec3 worldNormal;
@@ -20,5 +21,7 @@ void main() {
float diff = max(dot(n, normalize(m_LightDir)), 0.0);
vec3 light = clamp(m_AmbientColor + m_SunColor * diff, 0.0, 1.0);
gl_FragColor = vec4(baseColor * light, m_Diffuse.a);
baseColor *= (1.0 - 0.18 * m_Wetness);
float shine = pow(diff, 12.0) * m_Wetness * 0.30;
gl_FragColor = vec4(baseColor * light + vec3(shine), m_Diffuse.a);
}

View File

@@ -6,6 +6,7 @@ uniform bool m_HasLeafMap;
uniform vec3 m_LightDir;
uniform vec3 m_SunColor;
uniform vec3 m_AmbientColor;
uniform float m_Wetness;
in vec2 texCoord;
in vec3 worldNormal;
@@ -27,5 +28,7 @@ void main() {
// Blätter transmittieren Licht — abs() für doppelseitige Beleuchtung
float diff = abs(dot(normalize(worldNormal), normalize(m_LightDir)));
vec3 light = clamp(m_AmbientColor + m_SunColor * diff * 0.6, 0.0, 1.0);
gl_FragColor = vec4(baseColor * light, 1.0);
baseColor *= (1.0 - 0.18 * m_Wetness);
float shine = pow(diff, 12.0) * m_Wetness * 0.25;
gl_FragColor = vec4(baseColor * light + vec3(shine), 1.0);
}

View File

@@ -0,0 +1,53 @@
uniform vec2 m_CloudOffset;
uniform float m_CloudCover;
uniform vec4 m_CloudColor;
in vec3 vDir;
out vec4 outColor;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
float vnoise(vec2 p) {
vec2 i = floor(p);
vec2 f = fract(p);
f = f * f * (3.0 - 2.0 * f);
return mix(mix(hash(i), hash(i + vec2(1.0, 0.0)), f.x),
mix(hash(i + vec2(0.0, 1.0)), hash(i + vec2(1.0, 1.0)), f.x), f.y);
}
float fbm(vec2 p) {
float v = 0.0;
float a = 0.5;
for (int i = 0; i < 6; i++) {
v += a * vnoise(p);
p = p * 2.17 + vec2(0.631, 1.137);
a *= 0.5;
}
return v;
}
void main() {
vec3 dir = normalize(vDir);
if (dir.y < -0.02) discard;
// Horizon fade — clouds become transparent near the horizon
float hFade = smoothstep(0.0, 0.15, dir.y);
// Stereographic projection: maps sphere direction to 2D without pole distortion
vec2 uv = dir.xz / (dir.y + 1.001);
uv = uv * 3.5 + m_CloudOffset;
float f = fbm(uv);
// m_CloudCover 0=clear (threshold high → few clouds), 1=overcast (threshold low → all clouds)
float threshold = mix(0.72, 0.22, m_CloudCover);
float softness = 0.09;
float cloud = smoothstep(threshold - softness, threshold + softness, f);
cloud *= hFade;
outColor = vec4(m_CloudColor.rgb, cloud * m_CloudColor.a);
}

View File

@@ -0,0 +1,9 @@
uniform mat4 g_WorldViewProjectionMatrix;
in vec3 inPosition;
out vec3 vDir;
void main() {
vDir = inPosition;
gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
}

View File

@@ -0,0 +1,238 @@
/*
Copyright (c) 2014-2022, Stephen Gold
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* fragment shader used by dome66.j3md
*/
#import "Common/ShaderLib/GLSLCompat.glsllib"
uniform vec4 m_ClearColor;
varying vec2 skyTexCoord;
#ifdef HAS_STARS
uniform sampler2D m_StarsColorMap;
#endif
#ifdef HAS_OBJECT0
uniform vec4 m_Object0Color;
uniform sampler2D m_Object0ColorMap;
varying vec2 object0Coord;
#endif
#ifdef HAS_OBJECT1
uniform vec4 m_Object1Color;
uniform sampler2D m_Object1ColorMap;
varying vec2 object1Coord;
#endif
#ifdef HAS_OBJECT2
uniform vec4 m_Object2Color;
uniform sampler2D m_Object2ColorMap;
varying vec2 object2Coord;
#endif
#ifdef HAS_OBJECT3
uniform vec4 m_Object3Color;
uniform sampler2D m_Object3ColorMap;
varying vec2 object3Coord;
#endif
#ifdef HAS_OBJECT4
uniform vec4 m_Object4Color;
uniform sampler2D m_Object4ColorMap;
varying vec2 object4Coord;
#endif
#ifdef HAS_OBJECT5
uniform vec4 m_Object5Color;
uniform sampler2D m_Object5ColorMap;
varying vec2 object5Coord;
#endif
#ifdef HAS_HAZE
uniform sampler2D m_HazeAlphaMap;
uniform vec4 m_HazeColor;
#endif
#ifdef HAS_CLOUDS0
uniform sampler2D m_Clouds0AlphaMap;
uniform vec4 m_Clouds0Color;
varying vec2 clouds0Coord;
#endif
#ifdef HAS_CLOUDS1
uniform sampler2D m_Clouds1AlphaMap;
uniform vec4 m_Clouds1Color;
varying vec2 clouds1Coord;
#endif
#ifdef HAS_CLOUDS2
uniform sampler2D m_Clouds2AlphaMap;
uniform vec4 m_Clouds2Color;
varying vec2 clouds2Coord;
#endif
#ifdef HAS_CLOUDS3
uniform sampler2D m_Clouds3AlphaMap;
uniform vec4 m_Clouds3Color;
varying vec2 clouds3Coord;
#endif
#ifdef HAS_CLOUDS4
uniform sampler2D m_Clouds4AlphaMap;
uniform vec4 m_Clouds4Color;
varying vec2 clouds4Coord;
#endif
#ifdef HAS_CLOUDS5
uniform sampler2D m_Clouds5AlphaMap;
uniform vec4 m_Clouds5Color;
varying vec2 clouds5Coord;
#endif
vec4 mixColors(vec4 color0, vec4 color1) {
vec4 result;
float a0 = color0.a * (1.0 - color1.a);
result.a = a0 + color1.a;
if (result.a > 0.0) {
result.rgb = (a0 * color0.rgb + color1.a * color1.rgb)/result.a;
} else {
result.rgb = vec3(0.0);
}
return result;
}
void main() {
#ifdef HAS_STARS
vec4 stars = texture2D(m_StarsColorMap, skyTexCoord);
#else
vec4 stars = vec4(0.0);
#endif
vec4 objects = vec4(0.0);
#ifdef HAS_OBJECT0
if (floor(object0Coord.s) == 0.0 &&
floor(object0Coord.t) == 0.0) {
objects = m_Object0Color;
objects *= texture2D(m_Object0ColorMap, object0Coord);
}
#endif
#ifdef HAS_OBJECT1
if (floor(object1Coord.s) == 0.0 &&
floor(object1Coord.t) == 0.0) {
vec4 object1 = m_Object1Color;
object1 *= texture2D(m_Object1ColorMap, object1Coord);
objects = mixColors(objects, object1);
}
#endif
#ifdef HAS_OBJECT2
if (floor(object2Coord.s) == 0.0 &&
floor(object2Coord.t) == 0.0) {
vec4 object2 = m_Object2Color;
object2 *= texture2D(m_Object2ColorMap, object2Coord);
objects = mixColors(objects, object2);
}
#endif
#ifdef HAS_OBJECT3
if (floor(object3Coord.s) == 0.0 &&
floor(object3Coord.t) == 0.0) {
vec4 object3 = m_Object3Color;
object3 *= texture2D(m_Object3ColorMap, object3Coord);
objects = mixColors(objects, object3);
}
#endif
#ifdef HAS_OBJECT4
if (floor(object4Coord.s) == 0.0 &&
floor(object4Coord.t) == 0.0) {
vec4 object4 = m_Object4Color;
object4 *= texture2D(m_Object4ColorMap, object4Coord);
objects = mixColors(objects, object4);
}
#endif
#ifdef HAS_OBJECT5
if (floor(object5Coord.s) == 0.0 &&
floor(object5Coord.t) == 0.0) {
vec4 object5 = m_Object5Color;
object5 *= texture2D(m_Object5ColorMap, object5Coord);
objects = mixColors(objects, object5);
}
#endif
vec4 color = mixColors(stars, objects);
vec4 clear = m_ClearColor;
#ifdef HAS_HAZE
vec4 haze = m_HazeColor;
haze.a *= texture2D(m_HazeAlphaMap, skyTexCoord).r;
clear = mixColors(clear, haze);
#endif
color = mixColors(color, clear);
// Bright parts of objects shine through the clear areas.
color.rgb += objects.rgb * objects.a * (1.0 - clear.rgb) * clear.a;
#ifdef HAS_CLOUDS0
vec4 clouds0 = m_Clouds0Color;
clouds0.a *= texture2D(m_Clouds0AlphaMap, clouds0Coord).r;
color = mixColors(color, clouds0);
#endif
#ifdef HAS_CLOUDS1
vec4 clouds1 = m_Clouds1Color;
clouds1.a *= texture2D(m_Clouds1AlphaMap, clouds1Coord).r;
color = mixColors(color, clouds1);
#endif
#ifdef HAS_CLOUDS2
vec4 clouds2 = m_Clouds2Color;
clouds2.a *= texture2D(m_Clouds2AlphaMap, clouds2Coord).r;
color = mixColors(color, clouds2);
#endif
#ifdef HAS_CLOUDS3
vec4 clouds3 = m_Clouds3Color;
clouds3.a *= texture2D(m_Clouds3AlphaMap, clouds3Coord).r;
color = mixColors(color, clouds3);
#endif
#ifdef HAS_CLOUDS4
vec4 clouds4 = m_Clouds4Color;
clouds4.a *= texture2D(m_Clouds4AlphaMap, clouds4Coord).r;
color = mixColors(color, clouds4);
#endif
#ifdef HAS_CLOUDS5
vec4 clouds5 = m_Clouds5Color;
clouds5.a *= texture2D(m_Clouds5AlphaMap, clouds5Coord).r;
color = mixColors(color, clouds5);
#endif
gl_FragColor = color;
}