【Unity】シェーダのグローバルなプロパティを定義する

2019年5月30日

最近知ったのですが、どうやらUnityのシェーダにはグローバルなプロパティを定義する方法があるようです。

Shader.SetGlobal 〜()

Shader.GetGlobal 〜()

シリーズです。

公式ドキュメントはこちら

https://docs.unity3d.com/ja/2017.4/ScriptReference/Shader.html

Unityのシェーダで扱える型は網羅されています。

呼び出し方もシンプルなクラスメソッドになっています。

使い道は、例えばシーン上の特定のライトの色や、プレイヤーキャラクターの位置を元に描画結果を変えたいなど、パーティクルや敵キャラなどの複数のオブジェクトの描画に変化をつけたい場合に使えます。

もちろん個別に自身のマテリアルをいじる事も出来ますが、基本的に手間が掛かります。

シェーダ(を包含するマテリアル)の種類が増える度にマテリアル変更のコード記述が必要ですし、安全にそれをやろうとするといかついコードになりがちです。

(自身のレンダラーをGetComponentして、マテリアルの複製を防ぐためにMaterialPropertyBlock経由で、プロパティを設定して…。というのを以前はやってました…。気づいてなかった…。)

ゲームの状況に応じて描画結果を変えたいと思う事はよくあるので、グローバルなプロパティを使う機会はあると思います!

使い方は、

・グローバルプロパティの名前と型を決める

・適用したいシェーダにプロパティを記述する

・ゲーム実行中にスクリプトから Shader.SetGlobal 〜() を呼び出して設定する

以上