アルファテスト

技術的なネタを書き留めるべきに思えるので書き始める。今日はXNA4.0でのアルファテストについて。

アルファテストとは、ピクセルのアルファ値によってそのピクセルを描画するかどうかを判定するというもの。昔のXNAではグラフィックデバイスの設定として存在していたのだが、XNA4.0やDirectX10以降などではピクセルシェーダで実装したほうが速いということで設定項目が廃止された。使いたい時はAlphaTestEffectというものを使えという情報があちこちで見つかるが、カスタムシェーダで使うにはどうすればいいのかという情報はあまり見ない。

カスタムシェーダでの実装は実際簡単で、ピクセルシェーダ内でclip命令を呼ぶだけだ。clip命令は数値をひとつ取り、その値が0未満ならばそのピクセルを破棄する。破棄するというのはつまり、画面に描画されずかつデプスバッファなどにも書き込まれないということである。これを利用することで透明なポリゴンを描画するときにデプスバッファ関係で問題が起きるのを防ぐことができる(半透明を扱うのは無理)。

注意点としては、強調したように条件が「0以下」ではなく「0未満」であること。α=0を渡しても破棄されないので、条件式にはαから適当に小さい値を引いたものを渡す必要がある。

参照
AlphaTestEffectなどのHLSLコード Windows Phoneデベロッパーセンター
clip命令のリファレンス

clip (DirectX HLSL)