【Unity】【シェーダ】シェーダ共通化テクニックまとめ

シェーダコードは一般的にプロジェクトの規模が大きいほど共通化の重要性が増しますが、
通化のために知っておかなければいけない知識がそれなりにあるのでまとめました。

単純な置換はマクロを使う

マクロは定数や関数とかを使いまわすのに便利です。

light11.hatenadiary.com

重い処理はshader_feature / multi_compileで分岐

shader_featuremulti_compileを使うと同じshaderファイルに一部だけ処理の違うバリアントを定義できます。
分岐する処理の中身が重いときに便利です。

light11.hatenadiary.com

複数パス間で共通の処理はCGINCLUDEで共通化

一つのシェーダファイルに複数パスを定義する場合はCGINCLUDEブロックにパス間で共通の処理を記述できます。

light11.hatenadiary.com

他シェーダのパスを使うUsePass

UsePassを使うと他のシェーダパスの処理をそのまま使えます。
シェーダファイルが別であっても利用可能です。

light11.hatenadiary.com

cgincファイルで一部の処理だけ別ファイルに切り出す

cgincファイルを使うと共通の処理を外部ファイルに切り出せるので、
複数のシェーダファイル間で共通の処理を記述するのに便利です。

light11.hatenadiary.com

Inspector拡張で外側から色々設定できるようにする

MaterialのInspector拡張をしていろいろ外側から設定できるようにすると、
シェーダの共通化の幅が広がります。

light11.hatenadiary.com

MaterialPropertyDrawerでアトリビュートを自作

MaterialPropertyDrawerを継承したクラスを作るとシェーダプロパティ用のアトリビュートを作れます。
Inspectorを拡張するほどじゃないものはアトリビュートにしたほうが便利です。

こまめにMaterialPropertyDrawerを定義しておくとInspector拡張した時に同じような処理を書かなくて済みます。

light11.hatenadiary.com

RenderQueueやRenderTypeをInspectorから変更する

RenderQueueRenderTypeだけが違うシェーダを作らなければならない時には、
Inspectorを拡張して設定できるようにすると便利です。

light11.hatenadiary.com

BlendModeをInspectorから変更する

ブレンドモードもInspectorから設定できたほうが便利です。
Blend One Oneみたいな指定も使う側にはわかりづらいので下記のような拡張がおすすめです。

light11.hatenadiary.com

ColorMaskをInspectorから変更する

アルファ書き込み有り/無しの変異体を作ることもあるかもしれません。
そんなときにはColorMaskをInspectorから変更できるようにします。

light11.hatenadiary.com

使用するTEXCOORDをマテリアルから指定できるようにする

TEXCOORDに値を入れてシェーダに渡すときには、
使用するTEXCOORDのインデックスとSwizzleをマテリアルから指定できるようにすると便利です。

light11.hatenadiary.com

KeywordEnumがスクリプトから扱いづらい問題

通化とは直接的には関係ありませんが、KeywordEnumを使うとスクリプトから
キーワードが更新しづらいので、こんな拡張をしておくと便利です。

light11.hatenadiary.com