In unity, we often required to change Shader rendering mode via script or through programming. Unfortunately, there is no single C# API or function available that directly applies to render mode changes in the material. So, here is the way to change rendering mode with code, thanks to official documentation provided by Unity:
Change Rendering Mode with C# Script
First of all, let's create a script and define the Rendering Mode enum. In the enum, we can define all the available rendering modes like opaque, cutout, fade, and transparent. public enum RenderingMode
{
Opaque,
Cutout,
Fade,
Transparent
}
Now let's make a method that accepts Material and the Rendering mode as a parameter.
The material parameter defines the input material whose rendering mode we want to change while the rendering mode parameter is the blend mode that we want to set on the material like Transparent, fad, cutout, or opaque.
public void SetupMaterialWithBlendMode(Material material, RenderingMode renderingMode)
{
switch (renderingMode)
{
case RenderingMode.Opaque:
material.SetOverrideTag("RenderType", "");
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
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.DisableKeyword("_ALPHAMODULATE_ON");
material.renderQueue = -1;
break;
case RenderingMode.Cutout:
material.SetOverrideTag("RenderType", "TransparentCutout");
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
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.DisableKeyword("_ALPHAMODULATE_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
break;
case RenderingMode.Fade:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
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.DisableKeyword("_ALPHAMODULATE_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
break;
case RenderingMode.Transparent:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add);
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.DisableKeyword("_ALPHAMODULATE_ON");
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent;
break;
}
}
In the above code snippet, you only need to pass the material and Rendering Mode. Like this:
SetupMaterialWithBlendMode(matInput, renderingModeInput);
Here is the full script available
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public class BlendModeChange : MonoBehaviour | |
{ | |
[Header("Materaila input whose rendering mode you want to change")] | |
public Material matInput; | |
[Header("Redering mode that you want to set")] | |
public RenderingMode renderingModeInput; | |
public enum RenderingMode | |
{ | |
Opaque, | |
Cutout, | |
Fade, | |
Transparent | |
} | |
private void Start() | |
{ | |
SetupMaterialWithBlendMode(matInput, renderingModeInput);//function calling demo, call this as you want | |
} | |
public void SetupMaterialWithBlendMode(Material material, RenderingMode renderingMode) | |
{ | |
switch (renderingMode) | |
{ | |
case RenderingMode.Opaque: | |
material.SetOverrideTag("RenderType", ""); | |
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add); | |
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.DisableKeyword("_ALPHAMODULATE_ON"); | |
material.renderQueue = -1; | |
break; | |
case RenderingMode.Cutout: | |
material.SetOverrideTag("RenderType", "TransparentCutout"); | |
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add); | |
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.DisableKeyword("_ALPHAMODULATE_ON"); | |
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest; | |
break; | |
case RenderingMode.Fade: | |
material.SetOverrideTag("RenderType", "Transparent"); | |
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add); | |
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.DisableKeyword("_ALPHAMODULATE_ON"); | |
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; | |
break; | |
case RenderingMode.Transparent: | |
material.SetOverrideTag("RenderType", "Transparent"); | |
material.SetInt("_BlendOp", (int)UnityEngine.Rendering.BlendOp.Add); | |
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.DisableKeyword("_ALPHAMODULATE_ON"); | |
material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.Transparent; | |
break; | |
} | |
} | |
} |
In the above code snippet, there are different shaderLab commands used you can find the detail about the commands here on Unity's official docs.
0 Comments