반응형
스크립트로 Shader의 Rendering Mode를 Opaque, Transparent로 변경하는 경우가 종종 있다.
이 때 분명히 Rendering Mode를 변경했는데, 반영이 되지 않는다면 아래와 같은 코드를 적용하면 된다.
public enum BlendMode
{
Opaque = 0,
Cutout,
Fade,
Transparent
}
public static void changeRenderMode(Material standardShaderMaterial, BlendMode blendMode)
{
switch (blendMode)
{
case BlendMode.Opaque:
standardShaderMaterial.SetFloat("_Mode",0.0f);
standardShaderMaterial.SetOverrideTag("RenderType", "Opaque");
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
standardShaderMaterial.SetInt("_ZWrite", 1);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = -1;
break;
case BlendMode.Cutout:
standardShaderMaterial.SetFloat("_Mode",1.0f);
standardShaderMaterial.SetOverrideTag("RenderType", "Opaque");
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
standardShaderMaterial.SetInt("_ZWrite", 1);
standardShaderMaterial.EnableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 2450;
break;
case BlendMode.Fade:
standardShaderMaterial.SetFloat("_Mode",2.0f);
standardShaderMaterial.SetOverrideTag("RenderType", "Transparent");
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
standardShaderMaterial.SetInt("_ZWrite", 0);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.EnableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.DisableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 3000;
break;
case BlendMode.Transparent:
standardShaderMaterial.SetFloat("_Mode",3.0f);
standardShaderMaterial.SetOverrideTag("RenderType", "Transparent");
standardShaderMaterial.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
standardShaderMaterial.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
standardShaderMaterial.SetInt("_ZWrite", 0);
standardShaderMaterial.DisableKeyword("_ALPHATEST_ON");
standardShaderMaterial.DisableKeyword("_ALPHABLEND_ON");
standardShaderMaterial.EnableKeyword("_ALPHAPREMULTIPLY_ON");
standardShaderMaterial.renderQueue = 3000;
break;
}
}
ShaderMaterial의 renderQueue Option으로 렌더링 순서를 정할 수 있는데, 겹쳐있는 Object들의 renderQueue가 같아 진하게 보이는 현상이 발생할 수 있다.
이 때 가장 바깥쪽에 있는 Object의 renderQueue를 3001로 변경하면 정상적으로 보여줄 수 있다.
반응형
'개발 > Unity' 카테고리의 다른 글
Unity - 멀티 디스플레이 활성화 후 안보이게하고싶을 때 (0) | 2021.08.31 |
---|---|
Unity - InputField 입력 이벤트 구현하기 (0) | 2021.08.18 |
Sprite Renderer Click Event 구현 (0) | 2021.08.03 |
SkinnedMeshRenderer Collider Update (0) | 2021.07.23 |
Sprite Renderer Overlay Shader 구현 (0) | 2021.06.03 |