うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Graphics.DrawMeshInstanced を利用してみる

Graphics.DrawMeshInstancedGPU Instancing を利用してメッシュを不要なゲームオブジェクトを作成するオーバーヘッドなしで メッシュを描画することができます

座標と Mesh、Material を指定するだけなのでかなりシンプルに利用することができます

using UnityEngine;
  
public class GrassRenderer : MonoBehaviour
{
    [SerializeField]
    private Material _material;
    [SerializeField]
    private Mesh _mesh;
     
    private Matrix4x4[] _transforms = new Matrix4x4[10];
 
    private void Start()
    {
        _transforms = new Matrix4x4[10];
        for (var i = 0; i < _transforms.Length; i++)
        {
            var position = new Vector3(i, 0f, 0f);
            var rotate = Quaternion.Euler(new Vector3(0f, Random.Range(0f, 360f), 0f)); 
            _transforms[i] = Matrix4x4.TRS(position, rotate, Vector3.one);
        }
    }
  
    private void Update()
    {
        Graphics.DrawMeshInstanced(_mesh, 0, _material, _transforms);
    }
}

実際に DrawCall を見てみるとちゃんと 1Drawで全インスタンス生成できています