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

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 を捨てることができます。

D3D10_USAGE のまとめ

従来 CPU からのアクセスは、リソース内の範囲を指定して Lock()/Unlock() を
呼び出していました。D3D10 では Map()/Unmap() に変わっていて、特にアクセス
範囲の指定もありません。
CPU と GPU のそれぞれのリソースアクセス制限は、生成時の D3D10_USAGE に
よって区別します。

・D3D10_USAGE_DEFAULT
  GPU が読み書きするリソース。CPU はアクセスできない。

・D3D10_USAGE_IMMUTABLE
  一度作成したら書き換えできない。constant のようなリソース。
  従来のゲームの作り方だと大半がこれに相当します。

・D3D10_USAGE_DYNAMIC
  CPU から GPU へ一方通行転送が可能。これを使うことで動的なオブジェクトも
  スムーズなやり取りができます。

・D3D10_USAGE_STAGING
  CPU 側で読み込めます。つまり GPU → CPU の転送が可能です。

それぞれの読み書き制限をまとめると次のようになります。

GPU-R,GPU-W,CPU-R,CPU-W
 ○  ○  ×  ×   DEFAULT
 ○  ×  ×  ×   IMMUTABLE
 ○  ×  ×  ○   DYNAMIC
 ○  ○  ○  ○   STAGING

特筆すべき点は、CPU 書込み禁止のリソースは Map() すらできないことです。
それじゃどうやって初期データを書き込むのかというと、バッファ作成時に
一緒に初期化用データを渡すことができます。
初期化時の一度きりの転送と Map() による直接アクセスを明確に分離している
わけですね。

また DYNAMIC は GPU が読み込みのみで CPU は書き込み専用です。
これを使えばスムーズな同期転送ができそうなこともわかります。

この辺必要な機能が明確になってかなりわかりやすくなりました。

D3D dual source color blending

D3D10 では dual source color blending なる便利機能があることを発見しました。
今まで pixel shader から 1つの render target に対して出力できるカラーは
RGBA の 4ch のみでした。

そのため例えば SrcAlpha + InvSrcAlpha などを使って pixel 毎の blend factor
として alpha を使用してしまうと、
Render Target の alpha にも任意の値を書き込みたいけどできないという
矛盾が生じてしまいます。

この新機能を使えば pixel shader からの出力が 4ch ×2 (SV_TARGET0, SV_TARGET1)
になるので、Render Target の alpha には diffuse や depth といった任意の値を
書き込みつつ、さらに任意の blend factor でブレンドできるといった設定が
可能になります。

これは便利だ

DirectX SDK February 2007

DirectX SDK February 2007 がリリースされています。
DirectX Software Development Kit February 2007
Vista 版 DirectX9 である Direct3D9Ex の説明やサンプルが追加されたようです。
DirectSound も Vista 向けのアップデートが行われており、Vista への移行が
本格的になってきました。
もちろん Direct3D 10 も含まれています。

やっぱり Vista が発売されたのが大きいですね。
DirectX まわりの動きも今後活発になりそうです。