Version: 2023.1
言語: 日本語
ShaderLab コマンド: AlphaToMask
ShaderLab コマンド: BlendOp

ShaderLab コマンド: Blend

フラグメントシェーダーの出力を GPU がどのようにレンダーターゲットと組み合わせるかを決定します。

このコマンドの機能は、BlendOp コマンドで設定できるブレンディング操作に依存します。ブレンド自体はすべてのグラフィックス API とハードウェアでサポートされていますが、ブレンド操作にはサポートがより限定されているものがあることに注意してください。

ブレンドを有効にすると、GPU でのいくつかの最適化 (主に隠れたサーフェスの除去/Early-Z) が無効になるため、GPU のフレームタイムが長くなることがあります。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
Blend

使用法

このコマンドは、レンダー状態の変更を行います。Pass ブロックで使用すると、そのパスのレンダー状態を設定することができます。また、SubShader ブロックで使用すると、そのサブシェーダー内のすべてのパスのレンダー状態を設定することができます。

ブレンドを有効にすると、以下のようになります。

  • BlendOp コマンドが使用されている場合は、ブレンド操作がその値に設定されます。そうでない場合は、ブレンド操作のデフォルトは Add です。
  • ブレンド操作が AddSubRevSubMinMax の場合、GPU はフラグメントシェーダーの出力値にソースファクターを掛けます。
  • ブレンド操作が AddSubRevSubMinMax の場合、GPU はレンダーターゲットにすでにある値にデスティネーションファクターを掛けます。
  • その結果得られた値に対して、GPU がブレンド処理を行います。

ブレンドの方程式は以下の通りです。

finalValue = sourceFactor * sourceValue operation destinationFactor * destinationValue

この方程式では

  • finalValue は、GPU がデスティネーションバッファに書き込む値です。
  • sourceFactor は Blend コマンドで定義されます。
  • sourceValue は、フラグメントシェーダーが出力する値です。
  • operation はブレンド操作です。
  • destinationFactor は Blend コマンドで定義されます。
  • destinationValue は、デスティネーションバッファにすでにある値です。
シグネチャ 構文例 機能
Blend <state> Blend Off デフォルトのレンダーターゲットのブレンドを無効にします。これはデフォルト値です。
Blend <render target> <state> Blend 1 Off 上と同じ。しかし、指定したレンダーターゲットに対して。(1)
Blend <source factor> <destination factor> Blend One Zero デフォルトのレンダーターゲットのブレンドを有効にします。RGBA 値のブレンド係数を設定します。
Blend <render target> <source factor> <destination factor> Blend 1 One Zero 上と同じ。しかし、指定したレンダーターゲットに対して。(1)
Blend <source factor RGB> <destination factor RGB>, <source factor alpha> <destination factor alpha> Blend One Zero, Zero One デフォルトのレンダーターゲットのブレンドを有効にします。RGBA 値とアルファ値のブレンド係数を分けて設定します。 (2)
Blend <render target> <source factor RGB> <destination factor RGB>, <source factor alpha> <destination factor alpha> Blend 1 One Zero, Zero One 上と同じ。しかし、指定したレンダーターゲットに対して。(1) (2)

ノート:

  1. レンダーターゲットを指定する署名は、OpenGL 4.0+、GL_ARB_draw_buffers_blend、または OpenGL ES 3.2 を必要とします。
  2. RGB とアルファを分けたブレンディングは、高度な OpenGL のブレンディング操作 とは互換性がありません。

有効なパラメーター値

パラメーター Value 機能
render target 整数 (0 から 7 の範囲) レンダーターゲットのインデックス
state Off ブレンドを無効にします。
factor One この入力値は 1 です。ソースカラーまたはデスティネーションカラーの値を使う場合に使用します。
Zero この入力値は 0 です。ソースまたはデスティネーションの値を削除する場合に使用します。
SrcColor GPU はこの入力値とソースカラーの値を乗算します。
SrcAlpha GPU はこの入力値とソースアルファカラーの値を乗算します。
SrcAlphaSaturate GPU は、この入力値に ソースアルファ の最小値と (1- デスティネーションアルファ) を乗算します。
DstColor GPU はこの入力値とフレームバッファのソースカラーの値を乗算します。
DstAlpha GPU はこの入力値とフレームバッファのソースアルファ値を乗算します。
OneMinusSrcColor GPU は、この入力値に (1 - ソースカラー) を乗算します。
OneMinusSrcAlpha GPU は、この入力値に (1 - ソースアルファ) を乗算します。
OneMinusDstColor GPU は、この入力値に (1 - デスティネーションカラー) を乗算します。
OneMinusDstAlpha GPU は、この入力値に (1 - デスティネーションアルファ) を乗算します。

一般的なブレンドタイプ

ここでは、最も一般的なブレンドタイプの構文を紹介します。

Blend SrcAlpha OneMinusSrcAlpha // 従来の透明度
Blend One OneMinusSrcAlpha // 事前に乗算された透明度
Blend One One // 追加
Blend OneMinusDstColor One // ソフトな追加
Blend DstColor Zero // 乗法
Blend DstColor SrcColor // 2x 乗法

Shader "Examples/CommandExample"
{
    SubShader
    {
         // SubShader を定義する残りのコードをここに記述

        Pass
        {    
              // この Pass の通常のアルファブレンディングを有効にします
      Blend SrcAlpha OneMinusSrcAlpha
            
              // Pass を定義する残りのコードをここに記述
        }
    }
}

このサンプルコードでは、SubShader ブロックでこのコマンドを使用するための構文を示しています。

Shader "Examples/CommandExample"
{
    SubShader
    {
         // Enable regular alpha blending for this SubShader
         Blend SrcAlpha OneMinusSrcAlpha

         // SubShader を定義する残りのコードをここに記述     

        Pass
        {    
              // Pass を定義する残りのコードをここに記述
        }
    }
}
ShaderLab コマンド: AlphaToMask
ShaderLab コマンド: BlendOp