1つのシェーダーに複数のパスが書かれることが多い
例えば Forward、ForwardAdd、Outline、ShadowCaster、Deferred
と。
また、シェーダーも目的別に複数ふえます
キャラ用、キャラ アルファクリップ有、キャラ 自己発光あり・・・ 背景、背景クリップ有、背景 自己発光あり、背景 輪郭線あり・・・
それらをそのまま書くと コピーペーストだらけの保守性のわるいものになります
そこで 保守性をあげるために
cginclude、UsePassなどがあります
とりあえず今回は、Passが多くなり醜くなったのでUsePassできれいにする
#元のコード
Passが複数あります
Shader "hogehoge"
{
Properties
{
hogehoge
}
SubShader{
Tags{ hoge }
Pass
{
name "FORWARD"
hogehoge
}
Pass
{
name "FORWARD_ADD"
hogehoge
}
Pass
{
name "OUTLINE"
hogehoge
}
Pass
{
name "SHADOW_CASTER"
hogehoge
}
}
FallBack "HOGE"
}
パスが増えるたびに どんどんコードが長くなりますし
シェーダーを増やすごとに このファイルをコピーしてカスタマイズしていきます
保守性やばいですね
#UsePassする
上記のPass{} の中身を UsePassを使い名前で参照します
Shader "hogehoge"
{
Properties
{
hogehoge
}
SubShader{
Tags{ hoge }
UsePass "hoge/FORWARD"
UsePass "hoge/FORWARD_ADD"
UsePass "hoge/OUTLINE"
UsePass "hoge/SHADOW_CASTER"
}
FallBack "HOGE"
}
Passの中身のシェーダーコードが名前で参照でき、これでパスやシェーダーが増えても安心!
Passの中身は
Shader "hoge" {
SubShader{
Pass
{
Name "FORWARD"
hoge
}
}
}
のように別のファイルにパスの中身をかけます
Shaderに名前をつけ、PassもNameで名前をつけます
Shader名/Pass名 で呼び出す
Shader名は、Materialにシェーダーを適用するときの名前のあれです
今回のパスの中身を記述したシェーダーは Materialから設定させたくないので
Shader名をHiddenから始めます
また 注意点としては PassのNameは 大文字小文字を使えますが、大文字小文字の区別なく判断されるので
私は大文字で統一しています