Hello, what you are trying to achieve should be possible. Scattering small instances like rocks, grass is something where VFX Graph can be used. Now, being able to handle large number of particles will require some proper setup and optimization so that it can properly scale.
Now, having a stable orientation usually requires at least two vectors. This is true in VFX Graph but also with other solution. Most orient blocks modes allow you to orient your particles thanks to a vector and assume that the rest will be derived from the Current Camera. This is something pretty common with real-time VFX. (Billboard facing quad, etc.).
Now if you want to control both the Alignment and Facing Vector you can use the “Advanced Mode” of the Orient Block. This mode allows you to provide both AxisZ (Facing Vector) and AxisY( Aligment Vector). In the case of a terrain, you could use the terrain Normals for the AxisY and the Tangent for the AxisX. I’m guessing that if you don’t want your grass to follow the camera is because you are using Interleaved Quad meshes for the grass. Alternatively, a cross-product between the terrain normal and the World-Up could work.
To sample the Terrain normals, UVs, Tangent and other properties, just use a Sample Mesh operator, and select what you want to output in the inspector.
Here, I’m spawning particles on the terrain and storing both the tangent and normals in attributes.
From here, those attributes are used in the Advanced mode of the Orient block:
This should get you the alignment that you are looking for:
I’m just using a regular unlit quad here, but it should work for meshes.
With this setup, you can easily add some swaying motion by modulating slightly the angle.
Here I’m using some animated noise bases on the particle position:
I hope that it will help you to achieve what you are looking for. I wish you a pleasant weekend.




