4
2

ShaderGraphのTargetを追加する

Posted at

はじめに

ShaderGraphに自作Targetの追加が出来たので、方法を残しておきます。
image.png

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

image.png

複製先のフォルダにAssembly Definition Reference Assetも作成し、
Unity.RenderPipelines.Universal.Editorを設定します。
image.png


ここまで対応すると、Consoleに大量のエラーが発生します。
ほとんどが同名クラスがあるという内容なので、クラス名をひたすらリネームし、
SubShaderUtilsなどstaticクラスやEnumなどは削除します。

リネームでエラーが消えたら
UniversalTargetのコンストラクタ内にあるdisplayNameを好きな名前にします。
※Universalのままだと表示されません。

ShaderGraphを確認すると、Targetから選択できるようになりました。
SubTargetを1つしか複製してないので、MaterialもLitのみになっています。
image.png

これで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に何を繋いでも強制的に赤くなるのが確認できました。
image.png

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;
}

Diffuseが2極化されました。
image.png

おわりに

アップデート時のメンテコストだけ怖いですが、
Unlitを使って作るよりは、だいぶ楽にCustomLitが作れそうな印象でした。

上記のテストプロジェクトはこちらにアップしてます。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2