シェーダコードは一般的にプロジェクトの規模が大きいほど共通化の重要性が増しますが、
共通化のために知っておかなければいけない知識がそれなりにあるのでまとめました。
- 単純な置換はマクロを使う
- 重い処理はshader_feature / multi_compileで分岐
- 複数パス間で共通の処理はCGINCLUDEで共通化
- 他シェーダのパスを使うUsePass
- cgincファイルで一部の処理だけ別ファイルに切り出す
- Inspector拡張で外側から色々設定できるようにする
- MaterialPropertyDrawerでアトリビュートを自作
- RenderQueueやRenderTypeをInspectorから変更する
- BlendModeをInspectorから変更する
- ColorMaskをInspectorから変更する
- 使用するTEXCOORDをマテリアルから指定できるようにする
- KeywordEnumがスクリプトから扱いづらい問題
単純な置換はマクロを使う
マクロは定数や関数とかを使いまわすのに便利です。
重い処理はshader_feature / multi_compileで分岐
shader_feature
やmulti_compile
を使うと同じshaderファイルに一部だけ処理の違うバリアントを定義できます。
分岐する処理の中身が重いときに便利です。
複数パス間で共通の処理はCGINCLUDEで共通化
一つのシェーダファイルに複数パスを定義する場合はCGINCLUDE
ブロックにパス間で共通の処理を記述できます。
他シェーダのパスを使うUsePass
UsePassを使うと他のシェーダパスの処理をそのまま使えます。
シェーダファイルが別であっても利用可能です。
cgincファイルで一部の処理だけ別ファイルに切り出す
cgincファイルを使うと共通の処理を外部ファイルに切り出せるので、
複数のシェーダファイル間で共通の処理を記述するのに便利です。
Inspector拡張で外側から色々設定できるようにする
MaterialのInspector拡張をしていろいろ外側から設定できるようにすると、
シェーダの共通化の幅が広がります。
MaterialPropertyDrawerでアトリビュートを自作
MaterialPropertyDrawer
を継承したクラスを作るとシェーダプロパティ用のアトリビュートを作れます。
Inspectorを拡張するほどじゃないものはアトリビュートにしたほうが便利です。
こまめにMaterialPropertyDrawer
を定義しておくとInspector拡張した時に同じような処理を書かなくて済みます。
RenderQueueやRenderTypeをInspectorから変更する
RenderQueue
やRenderType
だけが違うシェーダを作らなければならない時には、
Inspectorを拡張して設定できるようにすると便利です。
BlendModeをInspectorから変更する
ブレンドモードもInspectorから設定できたほうが便利です。
Blend One Oneみたいな指定も使う側にはわかりづらいので下記のような拡張がおすすめです。
ColorMaskをInspectorから変更する
アルファ書き込み有り/無しの変異体を作ることもあるかもしれません。
そんなときにはColorMaskをInspectorから変更できるようにします。
使用するTEXCOORDをマテリアルから指定できるようにする
TEXCOORDに値を入れてシェーダに渡すときには、
使用するTEXCOORDのインデックスとSwizzleをマテリアルから指定できるようにすると便利です。
KeywordEnumがスクリプトから扱いづらい問題
共通化とは直接的には関係ありませんが、KeywordEnumを使うとスクリプトから
キーワードが更新しづらいので、こんな拡張をしておくと便利です。