커스텀 제어 가능 알파 블렌딩 && 펙터

2022. 7. 26. 18:30Public/Shader

다음은 모든 문제가 그대로 발생하는, 전형적인 알파 블렌딩 쉐이더 이다.

Shader "Custom/CustomBlending_problematic_Shader"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}
        zwrite off
        blend SrcAlpha OneMinusSrcAlpha

        CGPROGRAM        
        #pragma surface surf Lambert keepalpha        
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };
        void surf (Input IN, inout SurfaceOutput o)
        {            
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;                        
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Legacy Shaders/Transparent/VertexLit"
}

- 주의할점 - 

  • zwrite off가 명시적으로 선언됐다.
  • blend SrcAlpha OneMinusSrcAlpha라는 구문이 생겼다.
  • keepalpha 라는 구문이 생겼다.

blend SrcAlpha OneMinusSrcAlpha

블렌딩 옵션이다. 이곳에서 사용할 수 있는 블렌딩 펙터는 다음이 있다.

 

  • One //숫자 1을 의미
  • Zero //숫자 0을 의미
  • SrcColor // 소스의 컬러를 의미
  • SrcAlpha //소스의 알파를 의미
  • DstColor //목적지(배경)의 컬러를 의미
  • DstAlpha //목적지(배경)의 알파를 의미
  • OneMinusSrcColor // 1 - 소스 컬러를 의미
  • OneMinusSrcAlpha // 1- 소스 알파를 의미
  • OneMinusDstColor // 1 - 목적지(배경)의 컬러를 의미
  • OneMinusDstAlpha // 1- 목적지(배경)의 알파를 의미

keepalpha //기본적으로 모든 불투명 쉐이더에 알파에 1.0을 입력하게 되어있다. 그것을 막아준다.

 

위의 코드에서 주목할 것은

zwrite on / off 로 z버퍼에 쓸 것인지의 여부를 선택할 수 있고 , blend 펙터로 블렌딩을 제어할 수 있다는 것이다.

 

메뉴얼을 보면 다음과 같은 기본적인 블렌딩 펙터 연산 조합을 추천하고 있다.

 

  • Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
  • Blend SrcAlpha One // Additive
  • Blend One One // Addtive No Alpha Black is Transparent
  • Blend DstColor Zero // Multiplicative
  • Blend DstColor SrcColor // 2x Multiplicative

이 조합 공식의 기본 공식은 다음과 같다.

(펙터) X Source + (펙터) X Destination

 

이펙터 그 '본인'은 'Source'(Src) 라 칭하고 이펙트가 그려질 때의 '배경'은 'Destination'(Dest)라고 칭한다.

 

 

 

'Public > Shader' 카테고리의 다른 글

블렌드 펙터 연산 - SrcAlpha One  (0) 2022.07.27
블렌드 펙터 연산 - SrcAlpha OneMinusSrcAlpha  (0) 2022.07.27
알파 테스팅과 컷아웃  (0) 2022.07.26
Alpha Blend  (0) 2022.07.25
Cubemap Reflection  (0) 2022.07.25