Version: 2017.1
ShaderLab : Texture Combiners
ShaderLab: Fog(旧)

ShaderLab: 旧 Alpha Testing

アルファテストは、ピクセルが画面に描画されることを防ぐ最も直前で行われる処理です。

  • 注意: アルファテストコマンドは フラグメントプログラム が使用されているときはまったく効果がありません。ほとんどのプラットフォームでは、アルファテスティングはシェーダーで HLSL clip() 関数を使用して行われます。最近は SetTexture コマンドを使用する代わりに、プログラマブルシェーダーを使用するのが理に叶っています。*

最終の出力カラーが計算された後、カラーは任意のオプションでアルファ値を固定値と比較させることができます。もしテストに失敗すると、ピクセルは画面に描画されません。

シンタックス

AlphaTest Off

すべてのピクセル(デフォルト)をレンダリングまたは …

AlphaTest comparison AlphaValue

アルファ値が特定の範囲にあるピクセルをレンダリングするように、アルファテストを設定します

Comparison

Comparison (比較)は次の言葉のどれかを指定します。

Greater ピクセルのアルファ値が AlphaValue より大きい場合のみレンダリング。
GEqual ピクセルのアルファ値が AlphaValue より大きいか等しい場合のみレンダリング。
Less ピクセルのアルファ値が AlphaValue より小さい場合のみレンダリング。
LEqual ピクセルのアルファ値が AlphaValue より小さいか等しい場合のみレンダリング。
Equal ピクセルのアルファ値が AlphaValue と等しい場合のみレンダリング。
NotEqual ピクセルのアルファ値が AlphaValue と等しくない場合のみレンダリング。
Always すべてのピクセルをレンダリング。AlphaTest Off と同等の機能
Never すべてのピクセルをレンダリングしない。

AlphaValue

0 と 1 の間の不動小数点数。float あるいは range プロパティーへの変数の参照も可能で、その場合は ( [VariableName] ) と標準的な括弧を使用して記述する必要があります。

説明

凹形のオブジェクトをレンダリングする場合にアルファテストは重要です。グラフィックスカードは、画面に描画されたすべてのピクセルのデプスの記録を管理します。もし新しいピクセルがすでにレンダリングされているものよりも遠くにある場合、新しいピクセルはディスプレイに描画されません。これは Blending をもってしても、オブジェクトが透き通って見えないことを意味します。

この図では、左の木は AlphaTest (アルファテスト)を用いてレンダリングされています。中のピクセルが、完全に透明か不透明であるかの、どちらかであることに注意してください。中央の木は Alpha Blending (アルファブレンディング)のみ使用してレンダリングされています - デプスバッファの影響で、近くの枝の透明な部分が遠くの葉を覆っていることに注意してください。右の木はこの後の最後の例で登場するシェーダーでレンダリングされています - 画像の乱れをなくすためにブレンディングとアルファテストの合成で実装されています。

参考例

最も簡単な例では、テクスチャにアルファチャネルを割り当てます。オブジェクトはアルファが 0.5 より大きいところのみ表示されます。

Shader "Simple Alpha Test" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
    }
    SubShader {
        Pass {
            // アルファが 50% より大きいピクセルだけを描画します
            AlphaTest Greater 0.5
            SetTexture [_MainTex] { combine texture }
        }
    }
}

これは単独ではあまり良くありません。次にライティングを追加して、閾値として Cutoff を微調整できるようにします。

Shader "Cutoff Alpha" {
    Properties {
        _MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
        _Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
    }
    SubShader {
        Pass {
            //  何をレンダリングするかを決定するのに
            // 上で定義した Cutoff パラメーターを使用
            AlphaTest Greater [_Cutoff]
            Material {
                Diffuse (1,1,1,1)
                Ambient (1,1,1,1)
            }
            Lighting On
            SetTexture [_MainTex] { combine texture * primary }
        }
    }
}

植物や木をレンダリングするとき、多くのゲームではアルファテストで特徴的な固いエッジが生じます。回避方法はオブジェクトを 2 回レンダリングすることです。最初のパスで、アルファテストを使用して 50%より不透明なピクセルのみレンダリングします。2 回目のパスでは、すでに除外された部分について、ピクセルのデプスを記録せずに、グラフィックスをアルファブレンディングします。遠くの枝が手前の枝を上書きするために若干の混乱はあるかもしれませんが、実際には、葉は多くのディテールを含むため気付くことは少ないです。

Shader "Vegetation" {
    Properties {
        _Color ("Main Color", Color) = (.5, .5, .5, .5)
        _MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
        _Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
    }
    SubShader {
        // 基本ライティングを設定
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On

        // 前向き後ろ向き両方のポリゴンをレンダリング
        Cull Off

        // 以下を最初に渡します
        // 不透明度が [_Cutoff] より大きいピクセルをレンダリング
        Pass {
            AlphaTest Greater [_Cutoff]
            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }

        // 以下を2 番目に渡します
        // 半透明の詳細をレンダリング
        Pass {
            // デプスバッファに書き込みをしないように
            ZWrite off
            // 既に書き込んたピクセルに書き込みをしないように
            ZTest Less
            // この値以下のピクセルだけをレンダリング
            AlphaTest LEqual [_Cutoff]

            // アルファブレンディングを設定
            Blend SrcAlpha OneMinusSrcAlpha

            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }
    }
}

個別のパスよりも、SubShader の中に設定がいくつかあることに注意してください。SubShader で設定した State (状態)は、その中のパスでデフォルト値として、継承されます。

ShaderLab : Texture Combiners
ShaderLab: Fog(旧)