ShaderLab syntax: Alpha testing

알파 테스트는 픽셀을 스크린에 쓰여지는 것으로부터 거절할 수 있는 마지막 기회입니다.

마지막 결과 색상이 계산되어진 후에, 색은 고정 값에 비교되어진 그것의 알파 값을 선택적으로 가질 수 있습니다. 테스트가 실패하면 픽셀은 디스플레이에 쓰여지지 않습니다.

Syntax

AlphaTest Off
모든 픽셀을 그립니다 (기본 세팅).
 
AlphaTest comparison AlphaValue
그것의 알파 값이 특정 범위안에 있는 픽셀들만 그리기 위한 알파 테스트를 세팅합니다.

Comparison

비교는 다음 단어들 중 하나입니다:

Greater 그것의 알파가 AlphaValue보다 큰 픽셀들만 그립니다.
GEqual 그것의 알파가’‘AlphaValue’’ 보다 크거나 같은 픽셀들만 그립니다.
Less 그것의 알파값이’‘AlphaValue’’ 보다 적은 픽셀들만 그립니다.
LEqual 그것의 알파값이’‘AlphaValue’’ 보다 적거나 같은 픽셀들만 그립니다.
Equal 그것의 알파값이’‘AlphaValue’’ 과 같은 픽셀들만 그립니다.
NotEqual 그것의 알파값이’‘AlphaValue’’ 과 다른 픽셀들만 그립니다.
Always 모든 픽셀을 그립니다. 이것은 AlphaTest Off와 기능적으로 동일합니다.
Never 어떠한 픽셀도 그리지 않습니다.

AlphaValue

0과 1사이의 소수점 숫자. 이것은 기본적인 사각형 타입의 괄호 포맷([변수 이름])을 사용해서 쓰여져야 하는 경우에 하나의 float 또는 범위 속성을 레퍼런스하는 변수를 위해 사용될 수 있습니다.

Details

알파 테스트는 투명한 부분들을 가지는 물체를 오목하게 표현할 때 중요합니다. 그래픽 카드는 스크린에 쓰여지는 모든 픽셀의 깊이의 레코드를 유지합니다. 하나의 새로운 픽셀이 이전에 그려진 픽셀보다 멀리 있다면 새로운 픽셀은 디스플레이에 쓰여지지 않습니다. 이것은 Blending과 함께 임에도 불구하고 물체가 들여다 보지 않을 것입니다.

이 그림에서 왼쪽에 나무는 AlphaTest를 사용해서 그려집니다. 그것안에 픽셀들이 어떻게 완전히 투명하거나 불투명한지를 참고하시기 바랍니다. 가운데 나무는 오직 Alpha Blending 사용해서 그려집니다. 나뭇 가지 근처의 투명한 부분들이 깊이 버퍼 때문에 어떻게 멀리있는 나뭇잎들을 커버하는지를 참고하시기 바랍니다.

 

 오른쪽에 있는 나무는 마지막 쉐이더 예를 사용해서 그려집니다 – 그것은 어떠한 아티팩트라도 숨기기 위해서 블렌딩과 알파 테스팅이 결합된 것을 구현합니다.

Examples

가장 간단한 가능한 예는 알파 채널을 가지는 하나의 텍스쳐를 그것에 지정하는 것입니다. 물체는 알파가 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 } } } }

'TA > Unity Shader 레퍼런스' 카테고리의 다른 글

Name  (0) 2012.07.18
Fog  (0) 2012.07.18
CullAndDepth  (0) 2012.07.18
SetTexture  (1) 2012.07.17
Pass Tags  (0) 2012.07.17
Posted by 프리랜서 디자이너