Skip to content

Instantly share code, notes, and snippets.

@ertanturan
Last active September 22, 2022 09:54
Show Gist options
  • Save ertanturan/12cd6bdf3665b2b3931d0b7777505331 to your computer and use it in GitHub Desktop.
Save ertanturan/12cd6bdf3665b2b3931d0b7777505331 to your computer and use it in GitHub Desktop.
Change Surface type and Blendmode of materials at runtime when using LWRP or HDRP
using System;
using UnityEngine;
using UnityEngine.Rendering;
public class MaterialController : MonoBehaviour
{
public enum BlendMode
{
Alpha,
Premultiply,
Additive,
Multiply
}
public enum SurfaceType
{
Opaque,
Transparent
}
public static void ChangeMaterialTransparency(Material targetMaterial, bool transparent)
{
if (transparent)
{
targetMaterial.SetFloat("_Surface", (float) SurfaceType.Transparent);
targetMaterial.SetFloat("_Blend", (float) BlendMode.Alpha);
}
else
targetMaterial.SetFloat("_Surface", (float) SurfaceType.Opaque);
SetupMaterialBlendMode(targetMaterial);
}
private static void SetupMaterialBlendMode(Material material)
{
if (material == null)
throw new ArgumentNullException("material");
var alphaClip = material.GetFloat("_AlphaClip") == 1;
if (alphaClip)
material.EnableKeyword("_ALPHATEST_ON");
else
material.DisableKeyword("_ALPHATEST_ON");
var surfaceType = (SurfaceType) material.GetFloat("_Surface");
if (surfaceType == 0)
{
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("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
material.SetShaderPassEnabled("ShadowCaster", true);
}
else
{
var blendMode = (BlendMode) material.GetFloat("_Blend");
switch (blendMode)
{
case BlendMode.Alpha:
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("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int) RenderQueue.Transparent;
material.SetShaderPassEnabled("ShadowCaster", false);
break;
case BlendMode.Premultiply:
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.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int) RenderQueue.Transparent;
material.SetShaderPassEnabled("ShadowCaster", false);
break;
case BlendMode.Additive:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.One);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int) RenderQueue.Transparent;
material.SetShaderPassEnabled("ShadowCaster", false);
break;
case BlendMode.Multiply:
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_SrcBlend", (int) UnityEngine.Rendering.BlendMode.DstColor);
material.SetInt("_DstBlend", (int) UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = (int) RenderQueue.Transparent;
material.SetShaderPassEnabled("ShadowCaster", false);
break;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment