알파 테스팅과 컷아웃

2022. 7. 26. 17:56Public/Shader

- 알파 블랜딩은 사실상 사용할 수 있는 부분이 한정적이다.

- 그림자도 나오지 않고, 앞뒤 판정은 명확하지 않으며 매우 무겁다.

- 나무,풀 등을 그려야 할 경우 , 알파 블렌딩을 사용한다면 많은 문제가 생길 확률이 높다.

 

그래서 그런 경우에 사용하는 방법이 알파 테스팅(컷아웃) 이다.

 

 

Shader "Custom/AlphaTesting"
{
    Properties
    {
        //_Color 구문을 살려놓은 이유는 없을경우 그림자가 나오지 않기때문
        //즉, 그림자를 그리는 Pass에서 그림자 색상을 위해서 해당 인자를 사용.
        _Color ("Color", Color) = (1,1,1,1) //추가        

        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Cutoff("Alpha cutoff",Range(0,1)) = 0.5 //추가
    }
    SubShader
    {
        Tags { "RenderType"="Transparentcutout" "Queue" = "AlphaTest"} //추가
        LOD 200

        CGPROGRAM       
        #pragma surface surf Lambert alphatest:_Cutoff //추가

        #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/Cutout/VertexLit"
    //Cutout 계열의 쉐이더 이름을 써주어야 그림자가 제대로 나옴.

}

이번에는 Queue는 AlphaTest이다.

해당 구문은 '일반 오브젝트(Geometry)''반투명(Transparent)'의 사이를 의미한다.

즉, 일반 불투명 오브젝트 - 알파 테스팅 - 알파 블렌딩 순서대로 그려진다.

 

_Cutoff 

구문으로, 각 필셀은 '잘라버릴' 정도를 구하게 된다. 

0.5 로 해놓으면 회색을 기준으로 더 어두운 색의 알파는 아예 찍어지지 않고 , 회색보다 밝은색의 알파는 

알파가 없는 것처럼 그려진다. 

 

(단점)

- 그래서 알파 테스트는 반투명이 되지 않는다.

- '반투명'이 되지 않으니 외곽도 거칠게 표현될 수 밖에 없다. (안티 알리아싱으로 외곽을 부드럽게 표현 할 수 있고 , 해상도가 높은 텍스쳐를 쓰면 알리아싱 현상도 덜 거슬린다.)

 

(장점)

- 그림자가 나온다.

- 알파 소팅의 문제도 일어나지 않는다.

- PC 버전에서는 알파 블렌딩보다 연산이 더 빠르다. (모바일 버전의 일부 기기는, 연산 특성상 하드웨어의 렌더링 방식과 문제가 생겨 알파 테스팅이 알파 블렌딩보다 더 느리다.)

 

배경팀이나 캐릭터팀에서 알파가 필요할 때 많이 사용할 수 밖에 없는 기능이다.

 

 

 

 

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

블렌드 펙터 연산 - SrcAlpha OneMinusSrcAlpha  (0) 2022.07.27
커스텀 제어 가능 알파 블렌딩 && 펙터  (0) 2022.07.26
Alpha Blend  (0) 2022.07.25
Cubemap Reflection  (0) 2022.07.25
커스텀 라이팅2  (0) 2022.07.17