diff --git a/src/app/shaders/grass.vert b/src/app/shaders/grass.vert index a8a0615..763adde 100644 --- a/src/app/shaders/grass.vert +++ b/src/app/shaders/grass.vert @@ -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;