RenderingUnityでGPUインスタンシングを使う上での基礎知識とシェーダの書き方をまとめました。参考Unity2019.2.6GPUインスタンシングとはGPUインスタンシングとは、要は「同じメッシュを一回のドローコールでいっぱい描画できる」機能です。木や草や岩など、大量に同じメッシュを配置するようなケースで効果を発揮します。Bachingのように事前にメッシュを結合したデータを持つ必要がありません。シェーダはこの機能に対応した書き方をしたものを使う必要があります。Shaderを使って簡単にGPUインスタンシングの効果を体験してみます。適当に位置とスケールの異なるメッシュを大量に配置しておきます。今回は下図のようにCubeとSphereの二種類のメッシュを大量に配置しました。次にこれらにStandardシェーダを設定したMaterialをアサインします。この時点でStatisticsを見ると、Batchesは780となっており大量のドローコールが発生していることがわかります。そこでGPUインスタンシングを使ってドローコールを減らします。Instancingにチェックを入れるだけです。batchingが763となりBachesが17まで減っていることがわかります。Debuggerを見てもメッシュの描画自体はたった4回のドローコールで行われていました。GPUインスタンシングに対応したシェーダを書く前節のようにUnityの組み込みシェーダを使うと簡単にGPUインスタンシングできます。自分で作ったシェーダでGPUインスタンシングをする場合には対応したシェーダを書く必要があります。いってもUnityが決めた書き方に従うだけなので難しいことはありません。位置とスケールをメッシュごとに変えられるシンプルなGPUインスタンシングに対応したシェーダを書いてみます。}}わかりやすくするため、ライティングなしの単色を返すシェーダにしました。GPUインスタンシング用の処理はコメントを書いて部分のみです。Instancingにチェックを入れるとGPUインスタンシングが効いていることが確認できます。位置やスケール以外のプロパティが異なるモデルを一気に描画する色など、位置やスケール以外のプロパティが異なるモデルをGPUインスタンシングで描画したい場合にはもうひと手間必要です。ここでは色が異なるモデルを描画するためのシェーダを書いてみます。}}_ColorというプロパティをGPUインスタンシングに対応させています。細かい説明はコメントに書いた通りです。このようにして定義したプロパティの値は、下記のようにMaterialPropertyBlockを通じて設定します。}}これにより色違いのメッシュをGPUインスタンシングによって効率的に描画できるようになりました。PBRのシェーダに対応させれば下図のようにライティングすることも可能です。ちなみにMaterialPropertyBlockの詳細については以下の記事にまとめていますので、必要に応じて参照してください。light11.hatenadiary.comGPUが対応している必要があるGPUインスタンシングはGPUの機能を使うため、GPUが対応していないと使えません。GLES3.0以上が対応しているようです。SystemInfo.supportsInstancingでサポート状況をチェックできます。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。インストールから基本的な使い方・注意点まとめ【Unity】【エディタ拡張】テクスチャを指定したUV座標で切り取って保存する【Unity】指定したアセットのAssetBundle名を取得する【Unity】【シェーダ】スクリプトからVP行列を渡してシェーダで座標変換に使う【Unity】【シェーダ】FloatやVectorをリニアライズ対象にするGammaアトリビュート月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。