Plants in 3D, from their parts
Trees and plants as bodies of their own parts, drawn in the painted tones the villagers are drawn in, lit by the scene's sun, bent by one wind, and handed over to a snapshot of the whole when their parts stop showing. Canon: a_plant_is_a_3d_body_of_its_parts. Every picture below is drawn live in this page by the rasteriser beside it; nothing is pre-rendered but the far snapshot, which is the point.
The eight, turning under the camera
Five tree ecotypes (their genes are the ranges in content/kaski/ecotypes.toml), then a bush, a stand of reeds and a small herb (stand-in genes, since no content row names a low plant's genes yet). A trunk and boughs are tapered tubes, branches and twigs thinner ones, leaves and needles are small alpha cards in clusters. Noon above, dusk below. The camera turns by thirty degrees a step; the frames are made as the page idles.
A gust, as one body
One wind field, read at each part's own place. A gust front travels downwind across the plant: the trunk moves barely, boughs more, branches and twigs most, since each part carries every bend below it, and the leaves flutter on top. The numbers are metres of drift of the part's tip at the front's peak.
The handover to the far snapshot
A tree is a body until its parts stop showing, here where a typical leaf or needle cluster is one pixel across (1 / median cluster half-size pixels a metre). Then it stands as one card that faces the camera, a picture of the whole tree taken from its own parts at twice the scale and folded down, the one nearest the angle the camera sees it from, in the light it was taken in. Each row: the body, the snapshot, and where they differ (grey is colour difference, red is body only, blue is snapshot only).
What it costs
From bench.cjs, run on the machine named below. Triangle and vertex counts are exact; the milliseconds are this page's JavaScript rasteriser and show how the costs stand against each other, not what a GPU frame costs. It is an ad hoc probe, not a bench of the mockspace framework, and the notes say what the crate's bench has to redo.
Grass and low cover
Out of scope here, and op's open question. What I would offer: a sward is not a plant counted one by one, it is a cover, so draw it as a cover. Each ground cell of cover carries blade clusters drawn as instances of a handful of blade-tuft bodies (the herb's rosette, small), the count by the cell's density, the wind read per tuft, and beyond a short distance the tufts give way to the ground's own painted tone, matched to it in colour and light, so the far sward is the ground itself. The tufts are the same bodies this page draws for a herb, so the grass moves with the one wind and takes the same light, and a footstep or a cart presses the tufts it passes through the surface-state field. The reeds here are the same machinery with taller stalks, which is the reason to keep one for both.
Notes: NOTES.md beside this page. Tests: node test.cjs. Frames: node shoot.cjs. Probe: node bench.cjs.