日別アーカイブ: 2007年6月24日

D3D10/DX10 のリソースなど

D3D8~D3D9 と比べて API の構造も使い方も用語も一新された D3D10 ですが
自由度があがったこともあり、とりわけリソース周りがわかりにくくなりました。

データ自体非常に汎用性があって、各種バッファの統合が行われました。
つまり「何にでも使えるようになった」わけです。
今までは作成時に用途もある程度決め打ちしていて、バッファとはデータ
そのものであって同時に使い方も表しています。
D3D10 ではデータと用途を分離して考えます。

例えば同じバッファでも IASetVertexBuffers() に渡せば頂点とみなされ、
IASetIndexBuffer() に渡せば Index としてアクセスできます。
頂点と index を、全く同じバッファに格納しておくこともできると
マニュアルには書かれています。
MSDN Resource Types (Direct3D 10)

同じようにテクスチャも、Texture1D/2D/3D はデータ構造をあらわすデータに
過ぎません。それらをどのようなアクセスするか、あらためて View を作る
必要があります。
サンプルを見ても、Texture は初期化時以外はほとんど出てきません。
D3D9 までの Texture と同じような扱われ方をしているのは D3D10ResourceView
の方です。

まとめ
・Resource には Buffer と Texture の 2種類存在する
  ・Buffer Resource
  ・Texture Resource

・Buffer と Texture にはそれぞれ Typed と Typeless がある。

・Buffer
  ・最小構成単位を element と呼ぶ。
  ・element は Float3 / Int4 のように最大で 4 component (4ch)
  ・異なるフォーマット(型)の element を混在できる。

・Texture
  ・最小構成単位を texel と呼ぶ。
  ・texel は element と同じように最大 4 component (4ch)
  ・miplevel 毎に subresource を持ち、さらに array できる。
  ・sampler をつかった filtering や multisample できる。

subresource は D3D9 までの Surface に相当するようです。

MSDN Choosing a Resource (Direct3D 10)
こちらに各用途に利用できるリソース一覧があります。
よく見ると RenderTargetView に Texture3D が使えます。
D3D10 では VolumeTexture へのレンダリングにも対応しているようです。
D3D10_TEX3D_RTV
この構造体で RenderTarget に W 方向の位置を与えることができるようです。

DX9 までだったらまず CapsViewer を起動して、マニュアルに書かれてあっても
本当に使えるものなのかどうか確認する必要がありました。将来のための拡張用
であって、現行ハードでは NO になってることが多くてよくがっかりします。
D3D10 だと Caps が無いので大丈夫なんでしょう。

shader から見たリソースは、ConstantBuffer 以外は ShaderResource になる
ようです。例えば tbuffer は、HLSL 上と API 上は cbuffer と全く同じように
構造体の変数としてバッファにアクセスできます。ところが内部の命令的には
ConstanBuffer より Texture に近く、アクセス時に ld 命令が発行されています。

Texture1D tex1;
Buffer buf1;
tbuffer { float4 tbParam; };

float v= tex1.Load( 0 ).x;
float v= buf1.Load( 0 ).x;
float v= tbParam.x;

これらの命令はどれも ld で、未使用であっても必ず 1 element (1 texel)
単位で読み込まれていました。表記上似ていても直接アドレッシング指定できる
ConstantBuffer とは異なっています。