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 と他のアルファテストされたシェーダーに利用できます。
次のブレンド操作を使用することができます。
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 コマンドの 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 乗算
部分的に透明なオブジェクトや、完全に透き通ったオブジェクトを描画する場合、その透明度はテクスチャのアルファチャンネルを使って定義します(例えば、木の葉や、草、鎖の柵など)。一般的に使われている方法が、いくつかあります:
オブジェクトが “半透明” として扱われる事が多く有り、その場合、いくつかのレンダリング機能を使う事ができません(例えば、ディファードシェーディングでは影を受ける事ができません)。コンケイブ型のオブジェクトや、アルファブレンドが重なったオブジェクトでは、ドローオーダーでも問題が発生する事があります。
一般的にアルファブレンドのシェーダーでは render queue を transparent に設定し、デプス書き込みをオフにします。シェーダーコードはこのようになります:
// サブシェーダー内
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
// 内部パス
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ピクセルシェーダーの clip()
HLSL 命令によって、ピクセルは “discard” されるか、基準外になります。つまり、オブジェクトはまだ、完全に不透明と考えられ、描画を命令する問題は発生しません。ただし、これはすべてのピクセルが完全に不透明、または透明ということであり、エイリアシング (ジャギー) を誘引します。
たいてい、アルファテストを行ったシェーダーは、レンダリングキューのカットアウトも設定します。そのため、シェーダーコードは以下のようになります。
// inside SubShader
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// inside CGPROGRAM in the fragment shader:
clip(textureColor.a - alphaCutoffValue);
マルチサンプル アンチエイリアシング (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 }
}
}
}