참고: 이 페이지의 ShaderLab 기능은 레거시이며, 이전 버전과의 호환성 목적으로만 문서화되었습니다. 셰이더 소스 파일에 HLSL 코드가 포함된 경우, Unity는 이러한 커맨드를 완전히 무시합니다. 셰이더 소스 파일에 HLSL 코드가 포함되지 않은 경우, Unity는 임포트 시 이러한 커맨드를 일반 셰이더 프로그램으로 컴파일합니다.
기능 이름 | 빌트인 렌더 파이프라인 | 유니버설 렌더 파이프라인(URP) | 고해상도 렌더 파이프라인(HDRP) | 커스텀 SRP |
---|---|---|---|---|
레거시 알파 테스트 | 지원 | 지원 안 함 | 지원 안 함 | 지원 안 함 |
최종 출력 컬러 계산 후 선택적으로 컬러의 알파 값을 고정 값과 비교할 수 있습니다. 테스트가 실패할 경우 디스플레이에 픽셀이 기록되지 않습니다.
AlphaTest Off
모든 픽셀(디폴트) 렌더링 또는…
AlphaTest 비교 AlphaValue
알파 값이 특정 범위 이내인 픽셀만 렌더링하도록 알파 테스트를 설정합니다.
비교에는 다음 용어 중 하나를 사용합니다.
Greater | 알파가 AlphaValue_보다 큰 픽셀만 렌더링합니다. | |GEqual |알파가 AlphaValue_보다 크거나 같은 픽셀만 렌더링합니다. |
Less | 알파 값이 AlphaValue 보다 작은 픽셀만 렌더링합니다. |
LEqual | 알파 값이 AlphaValue 보다 작거나 같은 픽셀만 렌더링합니다. |
Equal | 알파 값이 AlphaValue_와 같은 픽셀만 렌더링합니다. | |NotEqual |알파 값이 AlphaValue_ 와 다른 픽셀만 렌더링합니다. |
Always | 모든 픽셀을 렌더링합니다. 기능적으로 AlphaTest Off 와 동일합니다. |
Never | 픽셀을 렌더링하지 않습니다. |
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
}
}
}
}
일부 설정은 개별 패스가 아닌 서브셰이더 안에 있습니다. 서브셰이더에서 설정된 상태는 그 안의 패스에서 디폴트로 상속됩니다.