Grass and wind
The grass is created using a compute shader with CUDA. This generates all the geometry at the start of the game, preventing the use of a geometry shader. In this pass, I generate all the vertices and indices, so I can render it later using a triangle list. Research showed this was more efficient than using a triangle strip, that's why I chose this direction.
In the vertex shader, I perform the procedural animation. Using the offset from the base of the base of the grass blade, I can apply a certain amount of rotation to bend both forwards and sidewards. This effect can be used for both wind and displacement.
The wind is sampled from a Perlin noise function and applied to the rotation of the grass blade. Using several layers of noise and parameters to configure direction and strength, I created a dynamic wind system.