#include "grass_vert.h" const char* shader_grass_vert = "attribute vec2 position; // Local quad vertex: x in [-0.5, 0.5], y in [0, 1] \n" "attribute vec3 instancePos; // Per-instance: world-space base of blade \n" "attribute float instancePhase; // Per-instance: random phase offset for sway \n" "attribute float instanceHeight; // Per-instance: height scale multiplier \n" " \n" "uniform mat4 projection; \n" "uniform mat4 view; \n" "uniform float time; \n" "uniform float bladeWidth; \n" "uniform float bladeHeight; \n" "uniform float swayAmount; \n" " \n" "varying lowp vec2 vUV; \n" " \n" "void main() { \n" " vec3 cameraRight = vec3(view[0][0], view[1][0], view[2][0]); \n" " float h = bladeHeight * instanceHeight; \n" " float sway = sin(time * 1.5 + instancePhase) * swayAmount * position.y; \n" " vec3 worldPos = instancePos \n" " + cameraRight * (position.x + sway) * bladeWidth \n" " + vec3(0.0, 1.0, 0.0) * position.y * h; \n" " \n" " gl_Position = projection * view * vec4(worldPos, 1.0); \n" " vUV = vec2(position.x + 0.5, position.y); \n" "} \n" " \n";