ShaderLab: 컬링 및 뎁스 테스트(Culling & Depth Testing)
ShaderLab: 패스 태그(Pass Tags)

ShaderLab: 블렌딩(Blending)

블렌딩은 투명 오브젝트를 만드는 데 사용됩니다.

그래픽스를 렌더링할 때는 모든 셰이더가 실행되고, 모든 텍스처가 적용된 후 픽셀이 화면에 작성됩니다. 이런 픽셀이 기존 픽셀에 결합되는 방법은 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) 인자

다음 프로퍼티는 모두 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()
픽셀 셰이더의 clip()

픽셀 셰이더에서 clip() HLSL 명령을 사용하여 픽셀을 “폐기”하거나 픽셀이 조건에 기반하지 않도록 할 수 있습니다. 따라서 오브젝트가 계속 완전히 불투명하고 오브젝트에 드로우 순서 문제가 없다고 간주할 수 있습니다. 하지만 모든 픽셀이 완전히 불투명하거나 투명하므로 앨리어싱(“들쑥날쑥한 선”)이 발생합니다.

알파 테스트를 거친 셰이더는 종종 컷아웃 렌더 대기열도 설정하므로 셰이더 코드는 다음과 같습니다.

// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// inside CGPROGRAM in the fragment Shader:
clip(textureColor.a - alphaCutoffValue);

알파 투 커버리지

4xMSAA에서 AlphaToMask 켜짐
4xMSAA에서 AlphaToMask 켜짐

멀티샘플 안티앨리어싱(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 }
        }
    }
}
ShaderLab: 컬링 및 뎁스 테스트(Culling & Depth Testing)
ShaderLab: 패스 태그(Pass Tags)