アルファテストは,ピクセルが画面に描画されることを拒否する最後の機会です。
最終の出力カラーが計算された後,カラーは任意のオプションでアルファ値を固定値と比較させることが出来ます。もしテストに失敗すると,ピクセルは画面に描画されません。
AlphaTest Off
全てのピクセル(デフォルト)をレンダリングまたは…
AlphaTest comparison AlphaValue
アルファ値が特定の範囲にあるピクセルをレンダリングするように,アルファテストを設定します
Comparison(比較)は次の言葉のどれかを指定します:
Greater | ピクセルのアルファ値が AlphaValue より大きい場合のみレンダリング。 |
GEqual | ピクセルのアルファ値が AlphaValue より大きいか等しい場合のみレンダリング。 |
Less | ピクセルのアルファ値が AlphaValue より小さい場合のみレンダリング。 |
LEqual | ピクセルのアルファ値が AlphaValue より小さいか等しい場合のみレンダリング。 |
Equal | ピクセルのアルファ値が AlphaValue と等しい場合のみレンダリング。 |
NotEqual | ピクセルのアルファ値が AlphaValue と等しくない場合のみレンダリング。 |
Always | 全てのピクセルをレンダリング。 AlphaTest Off と同等の機能 |
Never | 全てのピクセルをレンダリングしない。 |
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(状態)は,その中のパスでデフォルト値として,継承されます。