#import "Common/ShaderLib/GLSLCompat.glsllib" uniform mat4 g_WorldViewProjectionMatrix; uniform mat4 g_WorldMatrix; uniform float g_Time; uniform float m_WindStrength; uniform float m_WindSpeed; uniform vec2 m_WindDir; in vec3 inPosition; in vec3 inNormal; in vec2 inTexCoord; in vec4 inColor; // R = Wind-Gewicht (0 = Wurzel, 1 = Spitze) out vec2 texCoord; out vec3 worldNormal; void main() { float windW = inColor.r; float t = g_Time * m_WindSpeed; vec4 worldPos = g_WorldMatrix * vec4(inPosition, 1.0); vec2 worldXZ = worldPos.xz; vec2 windN = (dot(m_WindDir, m_WindDir) > 0.001) ? normalize(m_WindDir) : vec2(0.0, 1.0); vec2 perpN = vec2(-windN.y, windN.x); float wavePhase = dot(worldXZ, windN); float randPhase = fract(sin(dot(worldXZ, vec2(127.1, 311.7))) * 43758.5453) * 6.2832; float mainSway = sin(t + wavePhase * 0.08 + randPhase) * windW * m_WindStrength; float crossSway = cos(t * 0.73 + wavePhase * 0.06 + randPhase) * windW * m_WindStrength * 0.25; vec3 animPos = inPosition + vec3( windN.x * mainSway + perpN.x * crossSway, 0.0, windN.y * mainSway + perpN.y * crossSway ); gl_Position = g_WorldViewProjectionMatrix * vec4(animPos, 1.0); texCoord = inTexCoord; worldNormal = normalize((g_WorldMatrix * vec4(inNormal, 0.0)).xyz); }