ShaderLab :Culling と Depth Testing
ShaderLab : Pass 内の Tags

ShaderLab: Blending

Blending は透明なオブジェクトの作成に使用します。

When graphics are rendered, after all Shaders have executed and all Textures have been applied, the pixels are written to the screen. How they are combined with what is already there is controlled by the Blend command.


Blend Off: ブレンドを無効にします (これがデフォルト)

Blend SrcFactor DstFactor : ブレンディングを設定し使用可能にします。生成されたカラーは SrcFactor と乗算します。画面にすでにあるカラーは DstFactor と乗算し、2 つは合成されます。

Blend SrcFactor DstFactor、SrcFactorA DstFactorA : 上記と同様ですが、アルファチャンネルをブレンディングするのに、異なる要素を使用します。

BlendOp Op: Instead of adding blended colors together, carry out a different operation on them.

BlendOp OpColor, OpAlpha: 上記と同様ですが、カラー (RGB) とアルファ (A) チャンネルに対し異なるブレンド操作を使用します。

Additionally, you can set upper-rendertarget blending modes. When using multiple render target (MRT) rendering, the regular syntax above sets up the same blending modes for all render targets. The following syntax can set up different blending modes for individual render targets, where N is the render target index (0..7). This feature works on most modern APIs/GPUs (DX11/12, GLCore, Metal, PS4):

  • Blend N SrcFactor DstFactor
  • Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
  • BlendOp N Op
  • BlendOp N OpColor, OpAlpha

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.



Add 同時にソースとデスティネーションを追加します。
Sub ソースからデスティネーションを減算します
RevSub デスティネーションからソースを減算します
Min このステージの値は Source Alpha の値を乗算します。
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 が logical 演算を使用している場合ブレンド係数は無視されます。

One One の値 - これでソースあるいは目的の色をそのまま使用したい場合に使用します。
Zero Zero の値 - これでソースあるいは目的の色をそのまま削除したい場合に使用します。
SrcColor このステージの値はソースカラー値を乗算する。
SrcAlpha このステージの値はソースα値を乗算する。
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 the Texture’s alpha channel (e.g. leaves, grass, chain fences etc.), several approaches are commonly used:

Alpha blending


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

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”).

Often, alpha-tested Shaders also set cutout render queue, so the Shader code looks like this:

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

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


AlphaToMask On、4xMSAA
AlphaToMask On、4xMSAA

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

この機能は、ほとんど不透明か透明で、とても薄い「部分的に透明」な部分がある (草、葉、その他類似のもの) テクスチャに対して最も効果を発揮します。

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

Here is a small example Shader that adds a Texture to whatever is on the screen already:

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