Unity ShaderLab: 알파 테스트
개요
알파 테스트는 픽셀의 알파 값을 고정 값과 비교하여 해당 픽셀을 렌더링할지 결정하는 기능입니다. 알파 테스트가 실패하면 픽셀은 화면에 표시되지 않습니다. 이 기능은 주로 투명한 부분이 있는 오브젝트를 렌더링할 때 중요합니다. 그래픽 카드는 화면에 작성된 모든 픽셀의 뎁스를 기록하며, 새로운 픽셀이 이미 렌더링된 픽셀보다 더 먼 경우 화면에 표시되지 않습니다.
구문
다음과 같은 구문으로 알파 테스트를 설정할 수 있습니다:
- AlphaTest Off: 모든 픽셀 렌더링 (기본값)
- AlphaTest 비교 AlphaValue: 알파 값이 특정 범위 내에 있는 픽셀만 렌더링
비교에 사용되는 용어: |용어|설명| |---|---| |Greater|알파가 AlphaValue_보다 큰 픽셀만 렌더링합니다.| |GEqual|알파가 AlphaValue_보다 크거나 같은 픽셀만 렌더링합니다.| |Less|알파 값이 AlphaValue보다 작은 픽셀만 렌더링합니다.| |LEqual|알파 값이 AlphaValue보다 작거나 같은 픽셀만 렌더링합니다.| |Equal|알파 값이 AlphaValue_와 같은 픽셀만 렌더링합니다.| |NotEqual|알파 값이 AlphaValue_와 다른 픽셀만 렌더링합니다.| |Always|모든 픽셀을 렌더링합니다.| |Never|픽셀을 렌더링하지 않습니다.|
AlphaValue는 0과 1 사이의 플로팅 포인트 숫자가 되며, 변수를 참조할 수도 있습니다.
예제
알파 테스트를 사용하는 가장 간단한 예제입니다:
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
}
}
}
}
이 예제에서는 나뭇잎의 세부적인 디테일을 보존하면서 알파 테스트의 효과를 극대화합니다.
마무리
알파 테스트는 게임 그래픽스에서 효과적으로 투명도를 관리할 수 있는 유용한 도구입니다. 적절한 설정과 조합을 통해 자연스럽고 현실적인 비주얼을 구현할 수 있습니다. 다양한 상황에 맞게 shader를 조정하여 필요한 비주얼을 달성하세요.