Alpha Blend

2022. 7. 25. 16:52Public/Shader

* 불투명(Opaque) 오브젝트는 먼저 그린다.

-> 불투명 오브젝트들은 Z버퍼 때문에 어차피 순서에 상관없이 그려도 상관이 없으므로 먼저 그린다.

 

* 반투명(Transparent) 오브젝트는 나중에 그린다.

-> 정확히는 반투명 계열의 쉐이더를 나중에 그립니다. 

 

* 반투명 오브젝트들끼리는 '멀리 있는 것' 부터 가까운 것까지 차례대로 그린다.

이것을 '알파 소팅(Alpha Sorting)' 이라고 합니다.

 

위의 문제점을 해결하기 위해서 매 프레임마다 계산되어야 하는 연산을 생각하면

  •  불투명 오브젝트들은 그저 계산되는 대로 그려주면 아무 문제가 없다. 반투명 오브젝트들은 일단 불투명한 오브젝트가 다 그려질 때까지 대기해야한다.

  •  그리고 이번엔 반투명 오브젝트들끼리 거리를 체크하는 연산을 추가해야 한다.

  •  불투명한 오브젝트는 앞에 커다란 벽이 있으면 그 뒤의 오브젝트는 그려주지 않아도 되므로 절약할 거리가 있는데, 반투명한 오브젝트는 뒤에서부터 그리게 되므로 앞에 커다란 반투명이 있으면 오히려 계산이 더 무거워지는 결과를 초래하게 된다.

  • 디퍼드 렌더링(Deferred Rendering)에서는 아예 반투명을 처리할 수 없어서, 포워드 렌더링 (Forward Rendering)으로 반투명을 따로 그려줘야만 한다.

 

 

요약하자면 알파의 원리는 다음과 같다.

  • 불투명(Opaque) 오브젝트는 먼저 그린다.
  • 반투명(Transparent) 오브젝트는 나중에 그린다.
  • 반투명 오브젝트들끼리는 뒤에서부터 그린다.

 

 

 

 

일단 기본적인 Alpha Shader 를 만들어 보겠습니다. 

Shader "Custom/0725AlphaBlend"
{
    Properties
    {              
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue" = "Transparent"}
        //Queue -> '그리는 순서'를 의미 Transparent라고 하면 '불투명 다음'에 그리는 것을 의미


        //양면 렌더
        cull off
       
        CGPROGRAM       
        #pragma surface surf Lambert alpha:fade    
        #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
    }
    //그림자가 Quad 모양으로 생성되는것을 사라지게 함
    FallBack "Legacy Shaders/Transparent/VertexLit"
}
}

여기에 _Color 기능만 추가하면 유니티 기본 내장 쉐이더인 Legacy Shaders/Transparent/Diffuse 와 동일

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

커스텀 제어 가능 알파 블렌딩 && 펙터  (0) 2022.07.26
알파 테스팅과 컷아웃  (0) 2022.07.26
Cubemap Reflection  (0) 2022.07.25
커스텀 라이팅2  (0) 2022.07.17
커스텀 라이팅  (0) 2022.07.17