Version: 2020.1
言語: 日本語
ShaderLab culling and depth testing
ShaderLab: Pass 内のタグ

ShaderLab: Blending

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 係数

すべてのプロパティは 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

透明度がテクスチャのアルファチャンネル (例えば、葉、草、フェンスなど) によって定義されているほとんど完全に不透明、または完全に透明なオブジェクトを描画するには、一般的に使用されているアプローチがいくつかあります。

アルファブレンディング

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

これは、しばしばオブジェクトが「半透明」とみなされなければならず、したがってレンダリング機能の一部を使用できない場合があることを意味します (例えば、デファードシェーディング、影を受け取れないなど)。へこんだ面または重なったアルファブレンドされたオブジェクトには、しばしば描画順序の問題もあります。

しばしば、アルファブレンドシェーダーは透明な レンダーキュー を設定し、デプスの書き込みをオフにします。そのため、シェーダーコードは以下のようになります。

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

// 内部パス
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha

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

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

ピクセルシェーダー内で clip() HLSL 命令を使用して、ピクセルを「破棄」したりある基準に基づかないようにすることができます。つまり、オブジェクトはまだ、完全に不透明とみなされ、描画順序の問題がありません。ただし、すべてのピクセルは完全に半透明、または、透明でエイリアシング (ぎざぎざ) を発生します。

しばしば、アルファブレンドシェーダーは レンダーキュー のカットアウトも設定します。シェーダーコードは以下のようになります。

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

// フラグメントシェーダーの CGPROGRAM 
clip(textureColor.a - alphaCutoffValue);

Alpha-to-coverage

AlphaToMask On、4xMSAA
AlphaToMask On、4xMSAA

マルチサンプルの 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 }
        }
    }
}
ShaderLab culling and depth testing
ShaderLab: Pass 内のタグ