feat: redo wind shader

This commit is contained in:
neru
2026-01-02 07:34:28 -03:00
parent 211e2128be
commit f1f05590fc
+19 -20
View File
@@ -1,38 +1,37 @@
float worldX = instanceMatrix[3][0];
float worldZ = instanceMatrix[3][2];
float noiseVal = fbm(vec2(worldX, worldZ) * 0.5);
vec4 worldPos = modelMatrix * instanceMatrix * vec4(0.0, 0.0, 0.0, 1.0);
float gx = worldPos.x;
float gz = worldPos.z;
float windSpeed = 0.3;
float windScale = 0.04;
vec2 mainWindDir = normalize(vec2(1.0, 0.6));
float windSpeed = 1.5;
vec2 windPos = vec2(worldX, worldZ) * windScale;
vec2 windFlow = windPos + vec2(uTime * windSpeed, uTime * windSpeed * 0.7);
float windTime = uTime * windSpeed;
vec2 windSamplePos = (worldPos.xz * 0.05) - (mainWindDir * windTime * 0.2);
float windStrength = fbm(windFlow);
windStrength = windStrength * 0.6 + 0.3;
float windBase = fbm(windSamplePos * 0.8) * 0.4 + 0.2;
float gustNoise = fbm(windSamplePos * 0.4);
float gust = pow(gustNoise, 3.0) * 1.8;
float totalWind = windBase + gust;
float turbulence = fbm(windPos * 3.0 + uTime * 2.0) * 0.15;
float phase = gx * 0.5 + gz * 0.3;
float spring = sin(uTime * 2.0 + phase) * 0.06 + sin(uTime * 4.5 + phase * 1.5) * 0.03;
vec2 windDir = vec2(
fbm(windPos * 0.5 + vec2(uTime * 0.1, 0.0)),
fbm(windPos * 0.5 + vec2(0.0, uTime * 0.1))
);
windDir = normalize(windDir - 0.5) * 0.8;
float angleNoise = fbm(windSamplePos * 2.0 + uTime * 0.1) - 0.5;
vec2 windDir = normalize(mainWindDir + vec2(-mainWindDir.y, mainWindDir.x) * angleNoise * 0.4);
float taperFactor = pow(uv.y, 4.0);
float taper = 1.0 - taperFactor * 0.6;
transformed.x *= taper;
transformed.z *= taper;
float curveStrength = 2.0 + noiseVal * 2.0;
float curveVal = fbm(vec2(gx, gz) * 0.5);
float curveStrength = 2.0 + curveVal * 2.0;
float curveAmount = uv.y * uv.y * curveStrength;
vec2 curveDir = normalize(vec2(noiseVal, fbm(vec2(worldZ, worldX))) - 0.5);
vec2 curveDir = normalize(vec2(curveVal, fbm(vec2(gz, gx))) - 0.5);
transformed.x += curveAmount * curveDir.x * 0.5;
transformed.z += curveAmount * curveDir.y * 0.5;
float swayAmount = (windStrength + turbulence) * uv.y * uv.y;
float swayAmount = (totalWind + spring) * uv.y * uv.y;
transformed.x += swayAmount * windDir.x;
transformed.z += swayAmount * windDir.y;
transformed.y -= abs(swayAmount) * 0.2;