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 {
            // Only render pixels with an alpha larger than 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 {
            // Use the Cutoff parameter defined above to determine
            // what to render.
            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 {
        // Set up basic lighting
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On

        // Render both front and back facing polygons.
        Cull Off

        // first pass:
        // render any pixels that are more than [_Cutoff] opaque
        Pass {
            AlphaTest Greater [_Cutoff]
            SetTexture [_MainTex] {
                combine texture * primary, texture
            }
        }

        // Second pass:
        // render in the semitransparent details.
        Pass {
            // Dont write to the depth buffer
            ZWrite off
            // Don't write pixels we have already written.
            ZTest Less
            // Only render pixels less or equal to the value
            AlphaTest LEqual [_Cutoff]

            // Set up alpha blending
            Blend SrcAlpha OneMinusSrcAlpha

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

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

ShaderLab : Texture Combiners
ShaderLab: Fog(旧)