日別アーカイブ: 2007年2月13日

D3D10 AlphaTest が無い

そういえば Direct3D10 使っていて AlphaTest が見当たりません。
もともと Direct3D9 の ShaderModel3.0 のときも、
Pixel を捨てるために次の2つの方法がありました。

(1) PixelShader の計算結果の値によって texkill する
(2) AlphaTest を Enable にして Alpha 値で出力する

(2) の方法だと、出力 Alpha を Blend に使ったり RenderTarget に
書き込みたい場合は複雑な計算式になってしまうことがあります。
結局 (1) の方法で (2) も実現できるのである意味重複した機能になっていました。

そういう意味では、D3D10 だと複数の方法から悩まなくて済むのでわかりやすく
なりました。
(それとももしかして AlphaToCoverage が AlphaTest 代わりになるのでしょうか?)

シェーダー側を

float4 PS_Main( PS_INPUT In ) : SV_Target
{
 float4 color= diffuse.Sample( samplestate, In.Tex );

 // AlphaTest
 if( color.w <= 0.001 ){
  clip( -1 );
 }

 return color;
}

のように書き換えて完了です。AlphaTest 相当になりました。
0.001 は AlphaRef に相当します。

clip() は texkill の HLSL 命令です。
値が負のときに pixel を捨てることができます。