土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

ShaderでBlendの引数をカスタマイズしたいという話

 StandardShaderでは、PassによってBlendやZWriteが以下のように記述されていて、外部から設定可能になっています(ただし、ここに出てくる_SrcBlendなどのプロパティはインスペクタ上は非表示なのでユーザーは直接変更できません。)

Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
Blend [_SrcBlend] [_DstBlend]
ZWrite [_ZWrite]

 ShaderLabではプロパティを"["〜"]"で囲むことでその値を使用できるんですが、具体的にどんな値が入っているのかが気になったので調べました。

 結論だけ書くと、Blend/ZWriteの引数は数値(小数点以下は切り捨て)を取ります。ユーザーが直接数値を設定する場合は、下記の対応する列挙体を参考にします(保証された方法ではないですが、StandardShaderがやってるんだから、問題ないかと思います)。

Cull [_Cull]

UnityEngine.Rendering.CullMode
https://docs.unity3d.com/ScriptReference/Rendering.CullMode.html

ZTest [_ZTest]

UnityEngine.Rendering.CompareFunction
https://docs.unity3d.com/ScriptReference/Rendering.CompareFunction.html

ZWrite [_ZWrite]

対応する列挙体無し。以下のようなプロパティを作る。

[Enum(Off, 0, On, 1)]
_ZWrite("ZWrite", Float) = 0

Blend [_SrcFactor][_DstFactor]

SrcFactor/DstDactorそれぞれ適用可能
https://docs.unity3d.com/ScriptReference/Rendering.BlendMode.html

参考記事

下記サイトを参考にさせていただきました。ありがとうございます(しかしこれどうやって確認したんだろう? すごい)
[Unity]ZTestやBlend等をシェーダー外から設定する
https://qiita.com/Fuji0k0/items/f5e5d3651391f9b16327