Blending は透明なオブジェクトの作成に使用します。
グラフィックスがレンダリングされる場合、すべてのシェーダーが実行され、すべてのテクスチャが適用された後に、ピクセルが画面に描画されます。それらを既存のものと合成する方法は Blend コマンドによって制御されます。
Blend Off
: ブレンドを無効にします (これがデフォルト)
Blend SrcFactor DstFactor
: ブレンディングを設定し使用可能にします。生成されたカラーは SrcFactor と乗算します。画面にすでにあるカラーは DstFactor と乗算し、2 つは合成されます。
Blend SrcFactor DstFactor、SrcFactorA DstFactorA
: 上記と同様ですが、アルファチャンネルをブレンディングするのに、異なる要素を使用します。
BlendOp Op
: ブレンドしたカラーを合わせる代わりに、異なる操作を行います。
BlendOp OpColor, OpAlpha
: 上記と同様ですが、カラー (RGB) とアルファ (A) チャンネルに対し異なるブレンド操作を使用します。
さらに、より優れたレンダーターゲットブレンドモードを設定できます。
複数のレンダーターゲット (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
: alpha-to-coverage をオンにします。MSAA を使用すると、alpha-to-coverage はマルチサンプルのカバレッジマスクを比例的にピクセルシェーダーの結果のアルファ値に変更します。これは通常、通常のアルファテストよりエイリアスの少ない輪郭に使用されます。植生やその他のアルファテスト済みシェーダーに役立ちます。
次のブレンド操作を使用することができます。
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 コマンドの 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 乗算
透明度がテクスチャのアルファチャンネル (例えば、葉、草、フェンスなど) によって定義されているほとんど完全に不透明、または完全に透明なオブジェクトを描画するには、一般的に使用されているアプローチがいくつかあります。
これは、しばしばオブジェクトが「半透明」とみなされなければならず、したがってレンダリング機能の一部を使用できない場合があることを意味します (例えば、デファードシェーディング、影を受け取れないなど)。へこんだ面または重なったアルファブレンドされたオブジェクトには、しばしば描画順序の問題もあります。
しばしば、アルファブレンドシェーダーは透明な レンダーキュー を設定し、デプスの書き込みをオフにします。そのため、シェーダーコードは以下のようになります。
// サブシェーダー内
Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
// 内部パス
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ピクセルシェーダー内で clip()
HLSL 命令を使用して、ピクセルを「破棄」したりある基準に基づかないようにすることができます。つまり、オブジェクトはまだ、完全に不透明とみなされ、描画順序の問題がありません。ただし、すべてのピクセルは完全に半透明、または、透明でエイリアシング (ぎざぎざ) を発生します。
しばしば、アルファブレンドシェーダーは レンダーキュー のカットアウトも設定します。シェーダーコードは以下のようになります。
// サブシェーダー内
Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
// フラグメントシェーダーの CGPROGRAM
clip(textureColor.a - alphaCutoffValue);
マルチサンプルの Anti Aliasing (MSAA、QualitySettings を参照) を使用すると、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 }
}
}
}