ShaderLab: 레거시 텍스처 컴바이너
ShaderLab: 레거시 안개

ShaderLab: 레거시 알파 테스트

알파 테스트는 픽셀이 화면에 쓰여지는 것을 취소할 마지막 기회입니다.

참고: AlphaTest 커맨드는 프래그먼트 프로그램을 사용하는 경우 아무런 영향이 없습니다. 대부분의 플랫폼에서 알파 테스트는 HLSL clip() 함수를 사용해 셰이더에서 수행됩니다. 이제는 SetTexture 커맨드 대신 프로그램 가능 셰이더를 사용하는 것이 좋습니다.

최종 출력 컬러 계산 후 선택적으로 컬러의 알파 값을 고정 값과 비교할 수 있습니다. 테스트가 실패할 경우 디스플레이에 픽셀이 기록되지 않습니다.

구문

AlphaTest Off

모든 픽셀(디폴트) 렌더링 또는…

AlphaTest 비교 AlphaValue

알파 값이 특정 범위 이내인 픽셀만 렌더링하도록 알파 테스트를 설정합니다.

비교

비교에는 다음 용어 중 하나를 사용합니다.

Greater 알파가 AlphaValue 보다 큰 픽셀만 렌더링합니다.
GEqual 알파가 AlphaValue 보다 크거나 같은 픽셀만 렌더링합니다.
Less 알파 값이 AlphaValue 보다 작은 픽셀만 렌더링합니다.
LEqual 알파 값이 AlphaValue 보다 작거나 같은 픽셀만 렌더링합니다.
Equal 알파 값이 AlphaValue_와 같은 픽셀만 렌더링합니다. | |NotEqual |알파 값이 AlphaValue_ 와 다른 픽셀만 렌더링합니다.
Always 모든 픽셀을 렌더링합니다. 기능적으로 AlphaTest Off 와 동일합니다.
Never 픽셀을 렌더링하지 않습니다.

AlphaValue

0과 1 사이의 플로팅 포인트 숫자입니다. 플로트 또는 범위 프로퍼티에 대한 변수 레퍼런스일 수도 있으며, 이 경우 표준 대괄호 표기법([VariableName])을 사용하여 작성해야 합니다.

세부 정보

알파 테스트는 투명한 부분이 있는 오목한 오브젝트를 렌더링할 때 중요합니다. 그래픽 카드는 화면에 작성된 모든 픽셀의 뎁스에 대한 기록을 유지합니다. 새 픽셀이 이미 렌더링된 픽셀보다 더 먼 경우 디스플레이에 작성되지 않습니다. 따라서 블렌딩을 사용해도 오브젝트가 표시되지 않습니다.

이 그림에서 왼쪽 나무는 AlphaTest를 사용하여 렌더링되었습니다. 나무의 픽셀은 완전히 투명하거나 불투명합니다. 가운데 나무는 Alpha Blending만 사용하여 렌더링되었습니다. 인근 가지의 투명한 부분이 뎁스 버퍼 때문에 멀리 있는 나뭇잎을 덮습니다. 오른쪽 나무는 블렌딩과 알파 테스트의 조합을 구현하여 결함을 숨긴 마지막 셰이더 예제를 사용하여 렌더링되었습니다.

예제

가장 간단하고 가능한 예제에서는, 알파 채널이 있는 텍스처를 할당합니다. 알파가 0.5보다 큰 경우에만 오브젝트가 표시됩니다.

Shader "Simple Alpha Test" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    }
    SubShader {
        Pass {
            // Only render pixels with an alpha larger than 50%
            AlphaTest Greater 0.5
            SetTexture [_MainTex] { combine texture }
        }
    }
}

위 예제 자체는 별로 좋지 않습니다. 광원을 조금 추가하고 컷오프 값을 미세 조정할 수 있게 해보겠습니다.

Shader "Cutoff Alpha" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
        _Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
    }
    SubShader {
        Pass {
            // Use the Cutoff parameter defined above to determine
            // what to render.
            AlphaTest Greater [_Cutoff]
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] { combine texture * primary }
        }
    }
}

식물과 나무를 렌더링하는 경우 많은 게임에 알파 테스트의 전형적인 하드 에지가 표시됩니다. 오브젝트를 두 번 렌더링하여 이 문제를 우회할 수 있습니다. 첫 패스에서는 알파 테스트를 사용하여 50%보다 더 불투명한 픽셀만 렌더링합니다. 두 번째 패스에서는 픽셀 뎁스를 기록하지 않고 그래픽을 잘라낸 부분에 알파 블렌드합니다. 더 멀리 있는 가지가 가까운 가지를 덮어쓰기 때문에 다소 혼란스러울 수 있지만, 실제로는 나뭇잎에 시각적 디테일이 많기 때문에 이런 현상을 알아채기 힘듭니다.

Shader "Vegetation" {
    Properties {
        _Color ("Main Color", Color) = (.5, .5, .5, .5)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }
    SubShader {
        // Set up basic lighting
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On

        // Render both front and back facing polygons.
        Cull Off

        // first pass:
        // render any pixels that are more than [_Cutoff] opaque
        Pass {
            AlphaTest Greater [_Cutoff]
            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }

        // Second pass:
        // render in the semitransparent details.
        Pass {
            // Dont write to the depth buffer
            ZWrite off
            // Don't write pixels we have already written.
            ZTest Less
            // Only render pixels less or equal to the value
            AlphaTest LEqual [_Cutoff]

            // Set up alpha blending
            Blend SrcAlpha OneMinusSrcAlpha

            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }
    }
}

일부 설정은 개별 패스가 아닌 서브셰이더 안에 있습니다. 서브셰이더에서 설정된 상태는 그 안의 패스에서 디폴트로 상속됩니다.

ShaderLab: 레거시 텍스처 컴바이너
ShaderLab: 레거시 안개