Hello there!
I started an implementation of GPU instancing for grass rendering in my project. I read that max instance is 1023 for RenderMeshInstanced, yet I saw that max instance per draw call is around 400-600 in the frame debugger. I have attached screenshots and my code sample. What could be the reason?
Another question: Should I disable Graphics.RenderMeshInstanced for the objects that are not visible to the camera (behind the camera) manually?
private void Awake()
{
_grassMesh = grassPrefab.transform.GetChild(0).GetComponent<MeshFilter>().sharedMesh;
_grassMat = grassPrefab.transform.GetChild(0).GetComponent<MeshRenderer>().sharedMaterial;
_grassRenderParams = new RenderParams(_grassMat);
_grassBatches.Add(new List<Matrix4x4>());
var addedMatrices = 0;
for (var i = 0; i < 200; i++)
{
for (var j = 0; j < 200; j++)
{
var localPos = new Vector3(i * 0.5f, 0, j * 0.5f);
var worldPos = transform.TransformPoint(localPos);
var rot = new Vector3(0, Random.Range(0, 360f), 0);
var scaleX = Random.Range(0.8f, 1.3f);
var scaleY = Random.Range(0.5f, 1.3f);
var scaleZ = scaleX;
var scale = new Vector3(scaleX, scaleY, scaleZ);
if (addedMatrices < 1000)
{
_grassBatches[^1].Add(Matrix4x4.TRS(worldPos, Quaternion.Euler(rot), scale));
addedMatrices++;
}
else
{
_grassBatches.Add(new List<Matrix4x4>());
addedMatrices = 0;
}
}
}
}
private void Update()
{
RenderBatches();
}
private void RenderBatches()
{
foreach (var grassBatch in _grassBatches)
{
Graphics.RenderMeshInstanced(_grassRenderParams, _grassMesh,0, grassBatch);
}
}
Best regards.

