GPUインスタンシングは同じメッシュを一度のドローコールでたくさん描く技術です。似たような機能として動的バッチがUnityにはあります。
GPUインスタンシング | 動的バッチ | |
概要 | 同じものをたくさん描く | 小さいものをまとめて描く |
技術的なこと | 描画APIの機能であり、新しめのGPUなら対応している | Unityが実装している機能であり、CPUでメッシュを一つにまとめて描画をしている |
描画するもの | 同じメッシュ | 異なるメッシュ |
頂点数 | 制限なし | 制限あり(180~900頂点) |
マテリアル | 一部異なることが可能 | 同じもの |
使いやすさ | 面倒(Shaderとスクリプトの対応が必要) | 簡単 |
GPUインスタンシングが使えるかはSystemInfo.supportsInstancingで調べればいいのだと思います。
Standard ShaderでもEnable GPU Instancingというオプションがあるのですが、これはインスタンスごとのTransformのみに対応しています。インスタンスごとに位置、回転、スケールは別々の値を持てるということです。
マテリアルの変更には対応していないので、このチェックを付けてもGPUインスタンシングがされないこともあります。
サンプル
マニュアルを参考にマテリアルの色をインスタンスごとに変えてみるサンプルを作ってみました。GitHubにに置いてあります。
GPU Instancingを行うにはマテリアルのところでEnable GPU Instancingをチェックする必要があります。これによりON/OFFが切り替わります。作ったサンプルではメッシュがCubeであり小さいため、動的バッチが使えます。
GPUインスタンシングを行ってないとき、マテリアルが同一(色が一致していれば)動的バッチで描画されます。
以下は2000個のオブジェクトを表示したものです。カメラから外れていると描画されないので、このとき少しカメラを後退されました。Batchesが4と少ないのがわかります。
Frame Debuggerで見るとよりよくわかります。今回だと511個が一度に描ける限度のようでした。正直もっと描けると思っていたのですが、少なかったです。
インスタンスごとのデータ用の領域がたぶん 4(float) x4(Colorはfloat4つ)x511 = 8176Bくらいのサイズまでしかないのだと思います。
コメント