7080 + 1

ゲームプログラミングの記事を書いてます。

【Unity】シェーダに関する走り書きメモ

個人的な走り書きです。まとめる気力があればちゃんとまとめます。

ShaderGUI を継承すればシェーダの Inspector を拡張できて、結構自由に値が設定できる

Standard Shader のにある Mode は シェーダ に _Mode という Property が存在して、シェーダでは使われていない
_Mode は HLSLコード内では定義されてないので、おそらく描画時に無駄に容量を食うということはない(未検証)
その Mode 切替は ShaderGUI を継承して独自にドロップダウンで設定できるようにしてる感じ。
この辺は Built-in Shader と Unity の CsReference を見れば全部公開されてるので参考にできる。

型について

上のURLにもあるが、シェーダでは float, half, fixed, int の型を扱うことができる
int を除いた 3つの型はどれも小数を扱う方だが、どういった値を表現したいかによって適切に選ばないとパフォーマンスや消費電力に影響が出る。
なんでもかんでも float にするのはダメ。
詳細:https://docs.unity3d.com/ja/2019.4/Manual/SL-DataTypesAndPrecision.html

ColorMask は必要な時だけ定義する

ColorMask を定義すると、書き込むチャンネルが減らせて描画負荷が下がりそうに見えるが、むしろ高コストなことがあるそうなので、必要な時だけ設定する。
それ含め最適化の Tips は下記に載ってる
シェーダーを書く場合のパフォーマンスのヒント - Unity マニュアル

影を簡単に付けたいときはFallbackを使えばいい(CastShadow)

Fallback VertexLit や Fallback Standard などしておくと、そちら側の ShadowCaster の Pass が実行されるので、特に何もしなくても影描画ができる

UsePass や Fallback では #define したものが無視される

NantokaShaderのNantokPass で#if NANTOKAで処理を変えてるとする
この時、別のシェーダが以下のようになっているとする

Subshader {
    #define NANTOKA
    Pass {
        ...
    }
    UsePass "NantokaShader/NantokaPass"
}

NantokaShader では NANTOKA は定義されてない判定になって、#if NANTOKA の中の処理は実行されない

ステンシルバッファが存在しないGPUがあるらしい

とある人から言われたことだけどそんなこと今日考えなくてもいいような気もする