블렌딩은 투명 오브젝트를 만드는 데 사용됩니다.
그래픽스를 렌더링할 때는 모든 셰이더가 실행되고, 모든 텍스처가 적용된 후 픽셀이 화면에 작성됩니다. 이런 픽셀이 기존 픽셀에 결합되는 방법은 Blend 커맨드로 제어합니다.
Blend Off
: 블렌딩을 끕니다(기본값).
Blend SrcFactor DstFactor
: 블렌딩을 설정하고 활성화합니다. 생성된 컬러는 SrcFactor로 곱합니다. 화면의 기존 컬러를 DstFactor로 곱한 후 둘을 더합니다.
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
: 위와 동일하지만 알파 채널 블렌딩에 다른 팩터를 사용합니다.
BlendOp BlendOp
: 블렌드된 컬러를 모두 더하지 않고 컬러에 대해 다른 연산을 대신 수행합니다.
BlendOp OpColor, OpAlpha
: 위와 동일하지만 컬러(RGB) 및 알파(A)채널에 다른 블렌드 연산을 사용합니다.
또한, upper-rendertarget 블렌딩 모드도 설정할 수 있습니다.
다중 렌더링 타겟(MRT) 렌더링을 사용하는 경우 위의 일반 구문은
모든 렌더링 타겟에 대해 동일한 블렌딩 모드를 설정합니다. 다음 구문은 개별 렌더링 타겟에 대해 각기 다른 블렌딩 모드를 설정할 수 있습니다. 구문에서 N
은 렌더링 타겟 인덱스(0–7)입니다. 이 기능은 대부분의 최신 API/GPU(DX11/12, GLCore, Metal, PS4)에서 작동합니다.
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha
AlphaToMask On
: 알파 투 커버리지를 켭니다. MSAA를 사용하는 경우 알파 투 커버리지는 멀티샘플 커버리지 마스크를 픽셀 셰이더 결과 알파 값과 비례하여 수정합니다. 일반적으로 일반 알파 테스트보다 덜 앨리어싱된 아웃라인에 사용되고 초목 및 기타 알파 테스트된 셰이더에 유용합니다.
다음 블렌드(Blend) 연산을 사용할 수 있습니다.
Add | 소스와 대상을 더합니다. |
Sub | 소스에서 대상을 뺍니다. |
RevSub | 대상에서 소스를 뺍니다. |
Min | 소스와 대상 중 더 작은 것을 사용합니다. |
Max | 소스와 대상 중 더 큰 것을 사용합니다. |
LogicalClear | 논리 연산: Clear (0) DX11.1에만 해당 |
LogicalSet | 논리 연산: Set (1) DX11.1에만 해당 |
LogicalCopy | 논리 연산: Copy (s) DX11.1에만 해당 |
LogicalCopyInverted | 논리 연산: Copy inverted (!s) DX11.1에만 해당 |
LogicalNoop | 논리 연산: Noop (d) DX11.1에만 해당 |
LogicalInvert | 논리 연산: Invert (!d) DX11.1에만 해당 |
LogicalAnd | 논리 연산: And (s & d) DX11.1에만 해당 |
LogicalNand | 논리 연산: Nand !(s & d) DX11.1에만 해당 |
LogicalOr | Logical operation: Or (s | d) DX11.1 only. |
LogicalNor | Logical operation: Nor !(s | d) DX11.1 only. |
LogicalXor | 논리 연산: Xor (s ^ d) DX11.1에만 해당 |
LogicalEquiv | 논리 연산: Equivalence !(s ^ d) DX11.1에만 해당 |
LogicalAndReverse | 논리 연산: Reverse And (s & !d) DX11.1에만 해당 |
LogicalAndInverted | 논리 연산: Inverted And (!s & d) DX11.1에만 해당 |
LogicalOrReverse | Logical operation: Reverse Or (s | !d) DX11.1 only. |
LogicalOrInverted | Logical operation: Inverted Or (!s | d) DX11.1 only. |
다음 프로퍼티는 모두 Blend 커맨드에서 SrcFactor와 DstFactor에 대해 유효합니다. Source는 계산된 컬러를 말하고 Destination은 이미 화면에 표시된 컬러입니다. 블렌드 인자는 BlendOp에서 논리 연산을 사용하는 경우 무시됩니다.
One | 1값입니다. 소스 또는 대상 컬러가 완전히 표시되도록 하려면 이 값을 사용합니다. |
Zero | 0값입니다. 소스 또는 대상 값을 제거하려면 이 값을 사용합니다. |
SrcColor | 스테이지 값을 소스 컬러 값으로 곱합니다. |
SrcAlpha | 스테이지 값을 소스 알파 값으로 곱합니다. |
DstColor | 스테이지 값을 프레임 버퍼 소스 컬러 값으로 곱합니다. |
DstAlpha | 스테이지 값을 프레임 버퍼 소스 알파 값으로 곱합니다. |
OneMinusSrcColor | 스테이지 값을 (1 - 소스 컬러)로 곱합니다. |
OneMinusSrcAlpha | 스테이지 값을 (1 - 소스 알파)로 곱합니다. |
OneMinusDstColor | 스테이지 값을 (1 - 대상 컬러)로 곱합니다. |
OneMinusDstAlpha | 스테이지 값을 (1 - 대상 알파)로 곱합니다. |
다음은 가장 일반적인 블렌드 타입입니다.
Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency
Blend One OneMinusSrcAlpha // Premultiplied transparency
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative
투명도가 텍스처의 알파 채널에 따라 정의되는 완전히 불투명하거나 완전히 투명한 오브젝트(예: 나뭇잎, 잔디, 체인 펜스 등)를 그리는 데는 일반적으로 다음과 같은 몇 가지 방법이 사용됩니다.
종종 오브젝트가 “반투명”으로 간주되어야 하므로 일부 렌더링 기능을 사용할 수 없습니다(예: 디퍼드 셰이딩, 섀도우를 리시브할 수 없음). 오목하거나 오버랩된 알파 블렌드된 오브젝트에도 종종 드로우 순서 문제가 있습니다.
알파 블렌드 셰이더는 종종 투명 렌더 대기열도 설정하고 뎁스 쓰기를 끕니다. 따라서 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
// inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
픽셀 셰이더에서 clip()
HLSL 명령을 사용하여 픽셀을 “폐기”하거나 픽셀이 조건에 기반하지 않도록 할 수 있습니다. 따라서 오브젝트가 계속 완전히 불투명하고 오브젝트에 드로우 순서 문제가 없다고 간주할 수 있습니다. 하지만 모든 픽셀이 완전히 불투명하거나 투명하므로 앨리어싱(“들쑥날쑥한 선”)이 발생합니다.
알파 테스트를 거친 셰이더는 종종 컷아웃 렌더 대기열도 설정하므로 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside CGPROGRAM in the fragment Shader:
clip(textureColor.a - alphaCutoffValue);
멀티샘플 안티앨리어싱(MSAA, QualitySettings 참조)을 사용하는 경우 알파 투 커버리지 GPU 기능을 사용해 알파 테스트 접근방식을 개선할 수 있습니다. 그러면 사용되는 MSAA 레벨에 따라 에지 형상이 개선됩니다.
이 기능은 대부분 불투명하거나 투명한 텍스처와 매우 얇은 “부분 투명” 영역(풀, 나뭇잎 등)에 가장 효과적입니다.
종종 알파 투 커버리지 셰이더는 컷아웃 렌더 대기열도 설정합니다. 따라서 셰이더 코드는 다음과 같습니다.
// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside Pass
AlphaToMask On
다음은 이미 화면에 있는 것에 텍스처를 추가하는 작은 셰이더 예제입니다.
Shader "Simple Additive" {
Properties {
_MainTex ("Texture to blend", 2D) = "black" {}
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
Blend One One
SetTexture [_MainTex] { combine texture }
}
}
}