ShaderLab :カリングと深度テクスチャ
ShaderLab : Pass 内の Tags

ShaderLab: Blending

Blending は透過のカラー作成に使用します。

グラフィックスがレンダリングされて、さらにすべてのシェーダーが実行されて、すべてのテクスチャが適用されると、画面にピクセルが描画されます。すでに存在しているピクセルに対して、どのように合成するかはブレンディングで制御されます。

シンタックス

Blend Off : ブレンディングを無効にします(デフォルト)。

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

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

BlendOp BlendOp: ブレンディングされたカラーを使用する代わりに別の処理を行います。

BlendOp OpColor, OpAlpha: 上記と同様ですが、アルファチャネルをブレンディングするのに、異なる操作を使用します。

AlphaToMask On: Alpha-to-coverage を有効にします。MSAA を使用すると、Alpha-to-coverage はピクセルシェーダーの結果のアルファ値に対して、マルチサンプル カバレッジマスクを均等に修正します。これは通常、正規のアルファテストよりエイリアスの少ないアウトラインで使用され、Vegetation と他のアルファテストされたシェーダーに利用できます。

Blend 操作

次のブレンド操作を使用することができます。

Add 同時にソースとデスティネーションを追加します。
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 論理演算 : Noop (d) DX11.1 のみ
LogicalInvert 論理演算 : Invert (!d) DX11.1 のみ
LogicalAnd Logical operation: And (s & d) DX11.1 only .
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 Logical operation: Equivalence !(s ^ d) DX11.1 only .
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 // 昔ながらの透明
Blend One OneMinusSrcAlpha // プリマルチプライドの透明
Blend One One // 追加
Blend OneMinusDstColor One // ソフトな追加
Blend DstColor Zero // 乗算
Blend DstColor SrcColor // 2x 乗算

アルファブレンディング、アルファテスト、Alpha To Coverage

部分的に透明なオブジェクトや、完全に透き通ったオブジェクトを描画する場合、その透明度はテクスチャのアルファチャンネルを使って定義します(例えば、木の葉や、草、鎖の柵など)。一般的に使われている方法が、いくつかあります:

アルファブレンディング

一般的なアルファブレンディング
一般的なアルファブレンディング

オブジェクトが “半透明” として扱われる事が多く有り、その場合、いくつかのレンダリング機能を使う事ができません(例えば、ディファードシェーディングでは影を受ける事ができません)。コンケイブ型のオブジェクトや、アルファブレンドが重なったオブジェクトでは、ドローオーダーでも問題が発生する事があります。

一般的にアルファブレンドのシェーダーでは render queue を transparent に設定し、デプス書き込みをオフにします。シェーダーコードはこのようになります:

// サブシェーダー内
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }

// 内部パス
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

アルファテスト / カットアウト

ピクセルシェーダーの clip()
ピクセルシェーダーの clip()

ピクセルシェーダーの clip() HLSL 命令によって、ピクセルは “discard” されるか、基準外になります。つまり、オブジェクトはまだ、完全に不透明と考えられ、描画を命令する問題は発生しません。ただし、これはすべてのピクセルが完全に不透明、または透明ということであり、エイリアシング (ジャギー) を誘引します。

たいてい、アルファテストを行ったシェーダーは、レンダリングキューのカットアウトも設定します。そのため、シェーダーコードは以下のようになります。

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

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

Alpha to Coverage

AlphaToMask On、4xMSAA
AlphaToMask On、4xMSAA

マルチサンプル アンチエイリアシング (MSAA、画質設定を参照してください) を使用する場合、“alpha to coverage” GPU 機能を利用してアルファテストを向上させることができます。この機能により、使用する MSAA レベルにしたがって、エッジの外観が向上します。

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

たいてい、Alpha-to-coverage シェーダーは、レンダリングキューのカットアウトも設定します。そのため、シェーダーコードは以下のようになります。

//サブシェーダー内部
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }

// パス内
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 :カリングと深度テクスチャ
ShaderLab : Pass 内の Tags