アルファテストは、ピクセルが画面に描画されることを防ぐ最も直前で行われる処理です。
最終の出力カラーが計算された後、カラーは任意のオプションでアルファ値を固定値と比較させることができます。もしテストに失敗すると、ピクセルは画面に描画されません。
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 (状態)は、その中のパスでデフォルト値として、継承されます。