ShaderLab: Culling & Depth Testing
ShaderLab: Pass 태그

ShaderLab: Blending

Blending은 투명 색상을 만드는 데 사용합니다.

그래픽 렌더링되어 있으며 모든 쉐이더가 실행되고, 모든 텍스처가 적용되면 화면에 픽셀이 그려집니다. 이미 존재하는 픽셀에 대해 어떻게 합성할 지는 블렌딩으로 제어됩니다.

구문(Syntax)

Blend Off : 블렌딩을 해제합니다.

Blend SrcFactor DstFactor : 블렌딩을 활성화하여 설정합니다. 생성된 색상은 SrcFactor 에 곱셈됩니다. 화면에 이미 있는 색상은 DstFactor 를 곱하여 두 개를 합성합니다.

Blend SrcFactor DstFactor, SrcFactorA DstFactorA : 위와 동일하지만, 알파 채널을 블렌딩하는 데에 다른 요소를 사용합니다.

BlendOp BlendOp : 블렌딩된 색상을 사용하는 대신 다른 작업을 수행합니다.

Blend SrcFactor DstFactor, SrcFactorA DstFactorA : 위와 동일하지만, 알파 채널을 블렌딩하는 데에 다른 요소를 사용합니다.

AlphaToMask On: Turns on alpha-to-coverage. When MSAA is used, alpha to coverage modifies multisample coverage mask proportionally to the pixel shader result alpha value. This is typically used for less aliased outlines than regular alpha-test; useful for vegetation and other alpha tested shaders.

Blend 작업

다음 블렌드 작업을 사용할 수 있습니다 :

Add 동시에 소스와 데스티네이션(Destination)을 추가합니다.
Sub 소스에서 데스티네이션을 뺍니다.
RevSub 데스티네이션에서 소스를 뺍니다.
Min 이 스테이지의 값은 Source Alpha 값을 곱합니다.
Max 소스와 데스티네이션 중 큰 값을 사용하십시오.
LogicalClear Logical operation: Clear (0) DX11.1 only.
LogicalSet Logical operation: Set (1) DX11.1 only.
LogicalCopy Logical operation: Copy (s) DX11.1 only.
LogicalCopyInverted Logical operation: Copy inverted (!s) DX11.1 only.
LogicalNoop Logical operation: Noop (d) DX11.1 only.
LogicalInvert Logical operation: Invert (!d) DX11.1 only.
LogicalAnd Logical operation: And (s & d) DX11.1 only.
LogicalNand Logical operation: Nand !(s & d) DX11.1 only.
LogicalOr Logical operation: Or (s | d) DX11.1 only.
LogicalNor Logical operation: Nor !(s | d) DX11.1 only.
LogicalXor Logical operation: Xor (s ^ d) DX11.1 only.
LogicalEquiv Logical operation: Equivalence !(s ^ d) DX11.1 only.
LogicalAndReverse Logical operation: Reverse And (s & !d) DX11.1 only.
LogicalAndInverted Logical operation: Inverted And (!s & d) DX11.1 only.
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 이 logical 연산을 사용하는 경우, 블렌드 계수는 무시됩니다.

One The value of one - use this to let either the source or the destination color come through fully.
Zero The value zero - use this to remove either the source or the destination values.
SrcColor The value of this stage is multiplied by the source color value.
SrcAlpha The value of this stage is multiplied by the source alpha value.
DstColor 이 스테이지의 값은 프레임 버퍼 Source Color
DstAlpha 이 스테이지의 값은 프레임 버퍼 Source Alpha 값을 곱합니다.
OneMinusSrcColor 이 스테이지의 값은 1 - Source Color 를 곱합니다.
OneMinusSrcAlpha 이 스테이지의 값은 1 - Source Alpha 를 곱합니다.
OneMinusDstColor 이 스테이지의 값은 1 - Destination Color 를 곱합니다.
OneMinusDstAlpha 이 스테이지의 값은 1 - Destination Alpha 를 곱합니다.

상세 정보

다음이 가장 일반적인 블렌딩의 유형입니다 :

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

Alpha Blending, Alpha Testing, Alpha To Coverage

For drawing mostly fully opaque or fully transparent objects, where transparency is defined by texture’s alpha channel (e.g. leaves, grass, chain fences etc.), several approaches are commonly used:

ShaderLab: Blending

Regular alpha blending
Regular alpha blending

Often this means that objects have to be considered as “semitransparent”, and thus can’t use some of the rendering features (deferred shading; can’t receive shadows etc.). Concave or overlapping alpha blended objects often also have draw ordering issues.

Most often alpha blended shaders also set transparent render queue, and turn off depth writes. So the shader code looks like:

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

// inside Pass
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

Alpha Testing / Cutout

clip() in pixel shader
clip() in pixel shader

By using clip() HLSL instruction in the pixel shader, a pixel can be “discarded” or not based on some criteria. This means that object can still be considered as fully opaque, and has no draw ordering issues. However, this means that all pixels are fully opaque or transparent, leading to aliasing (“jaggies”).

Most often alpha tested shaders also set cutout render queue. So the shader code looks like:

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

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

Alpha to Coverage

AlphaToMask On, at 4xMSAA
AlphaToMask On, at 4xMSAA

When using multisample anti-aliasing (MSAA, see QualitySettings), it is possible to improve alpha testing approach by using “alpha to coverage” GPU functionality. This improves edge appearance, depending on the MSAA level used.

This functionality works best on texures that are mostly opaque or transparent, and have very thin “partially transparent” areas (grass, leaves and similar).

Most often alpha-to-coverage shaders also set cutout render queue. So the shader code looks like:

// 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 태그