はじめに
ShaderGraphに自作Targetの追加が出来たので、方法を残しておきます。
Targetを追加してなにがしたいのか?
Toon調のShaderを作りたかった。
最初はUnlitをベースに進めていたのですが、ノードからだと制御が難しい箇所も多く、
LitShaderを改造した方が早いのでは?と思い試してみました。
動作環境
- unity2022.3.33f1
※UnityアップデートでShaderGarphに更新が入ると要修正なのでご留意ください。
既存のTargetを複製する
1から作っていくのは大変なので、既存のTargetを複製し、必要な箇所だけ書き換えていきます。
Targetに必要なScriptはここに入ってるので、必要なものだけAssets以下に複製します。
Packages/com.unity.render-pipelines.universal/Editor/ShaderGraph/Targets
・UniversalTarget //Target
・UniversalSubTarget //Materialの親
・UniversalLitSubTarget //LitMaterial
複製先のフォルダにAssembly Definition Reference Asset
も作成し、
Unity.RenderPipelines.Universal.Editor
を設定します。
ここまで対応すると、Consoleに大量のエラーが発生します。
ほとんどが同名クラスがあるという内容なので、クラス名をひたすらリネームし、
SubShaderUtils
などstaticクラスやEnumなどは削除します。
リネームでエラーが消えたら
UniversalTarget
のコンストラクタ内にあるdisplayName
を好きな名前にします。
※Universalのままだと表示されません。
ShaderGraphを確認すると、Targetから選択できるようになりました。
SubTargetを1つしか複製してないので、MaterialもLitのみになっています。
これでTargetの複製までは完了しました!
Targetの改造
今は初期のLitShaderと同じ状態だと思うので、ここから改造していきます。
ShaderもScript同様に必要なものを複製し、書き換える形にします。
UniversalTarget
UniversalLitSubTarget
このスクリプトの#region Includes
のすぐ下に、hlslのPathが書かれています。
改造したいhlslを複製し、pathも書き換えます。
あとは複製したファイルを編集することで、自由に改造できます。
以下テスト
UniversalLitSubTarget >> kForwardPass PBRForwardPass.hlsl//Forweadパスのエントリー
ForwardレンダリングのPassはまずこのファイルを通るので、Fragの最後を編集してみます。
half4 color = UniversalFragmentPBR(inputData, surface);
color.rgb = MixFog(color.rgb, inputData.fogCoord);
color.a = OutputAlpha(color.a, isTransparent);
+ color.rgb = half3(1, 0, 0);
outColor = color;
Base Colorに何を繋いでも強制的に赤くなるのが確認できました。
PBRForwardPass.hlsl
からだとライト計算には干渉できなそうなので、
UniversalFragmentPBR
関数の持ち主lighting.hlsl
も編集してみます。
half3 LightingPhysicallyBased(BRDFData brdfData, BRDFData brdfDataClearCoat,
half3 lightColor, half3 lightDirectionWS, half lightAttenuation,
half3 normalWS, half3 viewDirectionWS,
half clearCoatMask, bool specularHighlightsOff)
{
half NdotL = saturate(dot(normalWS, lightDirectionWS));
+ NdotL = step(0.5, NdotL);
half3 radiance = lightColor * (lightAttenuation * NdotL);
half3 brdf = brdfData.diffuse;
.
.
.
.
return brdf * radiance;
}
おわりに
アップデート時のメンテコストだけ怖いですが、
Unlitを使って作るよりは、だいぶ楽にCustomLitが作れそうな印象でした。
上記のテストプロジェクトはこちらにアップしてます。