標準シェーダーのレンダリングモードをスクリプトから切り替える

2018-08-29

Unityの標準シェーダーを使ったマテリアルで、インスペクタからRendering ModeをOpaque, Cutout, Fade, Transparentから選択で切り替えられる。 これを手動じゃなくスクリプトから行いたかったので方法を調べた。

スクリプトでUnityのStandardシェーダーのRendering Modeを変える を参考にしてみたがうまく切り替わらずなんでかなーと思ったら、単にmaterial.SetFloat("_Mode", (float)blendMode); が必要なだけだった:

public class BlendModeUtils : MonoBehaviour {
public enum Mode {
Opaque,
Cutout,
Fade,
Transparent,
}

public static void SetBlendMode(Material material, Mode blendMode) {
+ material.SetFloat("_Mode", (float)blendMode); // <= これが必要

switch (blendMode) {
case Mode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
break;
case Mode.Cutout:
material.SetOverrideTag("RenderType", "TransparentCutout");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.EnableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 2450;
break;
case Mode.Fade:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
case Mode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
}
}
}
  • renderQueueの値とか決め打ちでよいんだろうかと思うが、diffを取る限りインスペクタから切り替えた場合と差はない模様。