スワップチェインの記述
typedef struct DXGI_SWAP_CHAIN_DESC {
DXGI_MODE_DESC BufferDesc;
DXGI_SAMPLE_DESC SampleDesc;
DXGI_USAGE BufferUsage;
UINT BufferCount;
HWND OutputWindow;
BOOL Windowed;
DXGI_SWAP_EFFECT SwapEffect;
UINT Flags;
} DXGI_SWAP_CHAIN_DESC;
- BufferDesc
- バックバッファの能力を表すDXGI_MODE_DESC構造体を指定します。後述しますが例えばバックバッファの幅とか高さ、フォーマットなどが入ります。
- SampleDesc
- マルチサンプリングの能力を表すDXGI_SAMPLE_DESC構造体を指定します。マルチサンプルというのは、ざっくり言えば「アンチエイリアス」の事です。これを高く設定するほどジャギが消えて見えますが、処理負荷は高くなってしまいます。この構造体にはDXGI_SAMPLE_DESC::CountとDXGI_SAMPLE_DESC::Qualityの2つのメンバがあります。Countには1ピクセルの色を決めるためのサンプリング数、Qualityには精度レベルを指定します。精度レベルはビデオカードによってサポートが異なるためID3D10Device::CheckMultisampleQualityLevelsメソッドが返す値以下にしなければなりません。面倒ならばマルチサンプルをしないCount=1、Quality=0に設定して構いません。
- BufferUsage
- バックバッファの使用制限についてのフラグをDXGI_USAGE列挙型で指定します。DirectX10からバックバッファのハードウェア制限がゆるくなりアクセス権が広がりました。例えばシェーダの入力に使えるようにするにはDXGI_USAGE_SHADER_INPUTを指定します。シェーダの出力に使えるようにするにはDXGI_USAGE_RENDER_TARGET_OUTPUTなどが指定されます。
- BufferCount
- スワップ(交換)するバッファの枚数を指定します。通常は1枚ですが沢山持たせることもできます。
- OutputWindow
- 出力先のウィンドウハンドルを指定します。これはお馴染みですね。
- Windowed
- ウィンドウモード(true)かフルスクリーンモード(false)かのフラグを指定します。
- SwapEffect
- スワップ方法をフラグで指定します。通常は単純なスワップを実行するDXGI_SWAP_EFFECT_DISCARDで構いません。
- Flags
- スワップチェインの付加能力を指定します。重要なのはDXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCHです。このフラグを指定するとフルスクリーン⇔ウィンドウモードの切り替えができるようになり、切り替え時のあれやこれやを自動的に行ってくれます。
ディスプレイモードの記述
typedef struct DXGI_MODE_DESC {
UINT Width;
UINT Height;
DXGI_RATIONAL RefreshRate;
DXGI_FORMAT Format;
DXGI_MODE_SCANLINE_ORDER ScanlineOrdering;
DXGI_MODE_SCALING Scaling;
} DXGI_MODE_DESC, *LPDXGI_MODE_DESC;
- Width、Height
- バックバッファの幅と高さを指定します。
- RefreshRate
- いわゆるリフレッシュレートをDXGI_RATIONAL構造体で指定します。この構造体はDXGI_RATIONAL::NumeratorとDXGI_RATIONAL::Denominatorの2つのメンバを持っていて、例えば60フレームにしたい場合はNumerator=60、Denominator=1と指定します。
- Format
- バックバッファのフォーマットをDXGI_FORMATで指定します。これはマニュアルをご覧になると分かると思いますがたっっっくさんあります!!!DirectX10時代の標準である浮動小数点テクスチャを指定する場合は例えばDXGI_FORMAT_R16G16B16A16_FLOAT(64bit浮動小数点テクスチャ)などと指定します。
- ScanlineOrdering
- スキャンラインの方法、つまりバックバッファをフリップした時にハードウェアがパソコンのモニターに点をどう描くかを指定します。プログレッシブとかインターレスなど選択が可能ですが、特段理由が無ければ0でOKです。
- Scaling
- バックバッファの絵を描画する時にウィンドウの大きさにスケーリングするかどうかを指定します。バックバッファの大きさを遵守するならDXGI_MODE_SCALING_CENTERED、ウィンドウサイズに引き伸ばすならばDXGI_MODE_SCALING_STRETCHEDを指定します。ゲームにもよりますが、引き伸ばしはあまりしない方が良いかなと思いますのでDXGI_MODE_SCALING_CENTEREDを指定しても良いかなと思います。
マルチサンプリングパラメータの記述
typedef struct DXGI_SAMPLE_DESC {
UINT Count;
UINT Quality;
} DXGI_SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;
- Count
- 1Pixelあたりのマルチサンプル数
- Quality
- イメージのクオリティレベル。この値が高いとパフォーマンスは落ちる。設定値の許容範囲は0~1で、かつID3D10Device::CheckMultisampleQualityLevelsが返す値未満でないとダメ。
- 備考
- アンチエイリアスなしの状態でのデフォルトのサンプラモードはcount=1, quality=0となっている。
マルチサンプルアンチエイリアシングを使う場合、全てのレンダリングターゲットとデプスバッファは同じcountとqualityを持たなければならない。
- Direct3D 10.0と10.1の違い
- 10.1になって、2つの新しいクオリティレベルが定義された
D3D10_STANDARD_MULTISAMPLE_PATTERN
D3D10_CENTER_MULTISAMPLE_PATTERN
レンダーターゲットのアクセスに使うリソースのサブリソースを特定する
typedef struct D3D10_RENDER_TARGET_VIEW_DESC {
DXGI_FORMAT Format;
D3D10_RTV_DIMENSION ViewDimension;
union {
D3D10_BUFFER_RTV Buffer;
D3D10_TEX1D_RTV Texture1D;
D3D10_TEX1D_ARRAY_RTV Texture1DArray;
D3D10_TEX2D_RTV Texture2D;
D3D10_TEX2D_ARRAY_RTV Texture2DArray;
D3D10_TEX2DMS_RTV Texture2DMS;
D3D10_TEX2DMS_ARRAY_RTV Texture2DMSArray;
D3D10_TEX3D_RTV Texture3D;
};
} D3D10_RENDER_TARGET_VIEW_DESC;
- Format
- ViewDimension
- Buffer
- Texture1D
- Texture1DArray
- Texture2D
- Texture2DArray
- Texture2DMS
- Texture2DMSArray
- Texture3D
ビューポートのディメンジョンを定義
typedef struct D3D10_VIEWPORT {
INT TopLeftX;
INT TopLeftY;
UINT Width;
UINT Height;
FLOAT MinDepth;
FLOAT MaxDepth;
} D3D10_VIEWPORT;
- TopLeftX
- ビューポートの左端x座標。範囲は-16384~16383
- TopLeftY
- ビューポートの上端y座標。範囲は-16384~16383
- Width
- ビューポートの幅。範囲は-16384~16383
- Height
- ビューポートの高さ。範囲は-16384~16383
- MinDepth
- ビューポートの最小深度。範囲は0~1
- MaxDepth
- ビューポートの最大深度。範囲は0~1
アセンブラ入力ステージ用の単一要素の記述
typedef struct D3D10_INPUT_ELEMENT_DESC {
LPCSTR SemanticName;
UINT SemanticIndex;
DXGI_FORMAT Format;
UINT InputSlot;
UINT AlignedByteOffset;
D3D10_INPUT_CLASSIFICATION InputSlotClass;
UINT InstanceDataStepRate;
} D3D10_INPUT_ELEMENT_DESC;
- SemanticName
- 頂点構造体の1つの項目名を文字列で示します。例えば位置であれば「POSITION」、法線であれば「NORMAL」などとなりますが、この名前は基本的に自由でしてIN_POSITIONとかXYZ_NORMAL等としても構いません。この名前は後でシェーダの入力セマンティクスの名前と比較され、整合性がチェックされます。
- SemanticIndex
- 同名のSemanticNameを識別するIDです。例えばテクスチャ座標を表す「TEXCOORD」は複数宣言できるためこのIDで区別する必要があります。これにより名前は「TEXCORRD0」などと解釈されます。
- Format
- 項目のフォーマット(整数、浮動小数点など)をDXGI_FORMAT列挙型で指定します。先の例の頂点位置はD3DXVECTOR3でしてfloat型が3要素あります。この場合はDXGI_FORMAT_R32G32B32_FLOATを指定します。指定できるフラグはDXGI_FORMAT列挙型で示されています。
- InputSlot
- 項目情報を送り込むスロットを指定します。スロットというのは1つの頂点構造体の情報をシェーダに並列に流し込む入り口のようなものです。例えば頂点構造体が位置と色を持っている場合、スロット0番にこれらをセットすると、0番のスロットからは位置と色の2つの情報がシェーダに流れ込みます。別の頂点構造体で法線を定義し、スロット1番にそれをセットすると、頂点シェーダには位置・色・法線の情報が入力されるわけです。面白い仕組みです。DirectX10では16個のスロットが用意されています。
- AlignedByteOffset
- 頂点構造体の先頭からこの項目までのオフセットバイト値を入れます。位置と色を宣言した場合、位置は先頭なので0オフセット、色は先頭から見てsizeof(float*3)もしくはsizeof(D3DXVECTOR3)のオフセットとなります。これを間違うと描画がおかしくなるので慎重に。
- InputSlotClass
- にはこの項目が頂点情報であるかインスタンス情報であるかをD3D10_INPUT_CLASSIFICATION列挙型で指定します。今回は頂点ですからD3D10_INPUT_PER_VERTEX_DATAとなります。機械的に指定して良い部分です。
- InstanceDataStepRate
- 一度に描画するインスタンスの数を指定します。今回のように頂点情報を記述する場合は0にしなければなりません。
パイプラインステートを含むエフェクトパスの記述
typedef struct D3D10_PASS_DESC {
LPCSTR Name;
UINT Annotations;
BYTE *pIAInputSignature;
SIZE_T IAInputSignatureSize;
UINT StencilRef;
UINT SampleMask;
FLOAT BlendFactor[4];
} D3D10_PASS_DESC;
- Name
- パス名を含む文字列
- Annotations
- 注釈の数
- pIAInputSignature
- 入力シグネチャ、もしくは頂点シェーダーへのポインタ
- IAInputSignatureSize
- 入力シグネチャのサイズ
- StencilRef
- デプス/ステンシルステートで使われるステンシル参照値
- SampleMask
- ブレンドステート用のサンプルマスク
- BlendFactor
- ブレンドステート用のRGBAブレンド要素
typedef struct D3D10_BUFFER_DESC {
UINT ByteWidth;
D3D10_USAGE Usage;
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
} D3D10_BUFFER_DESC;
- ByteWidth
- 作成するバッファのサイズを指定。これは純粋に頂点の数×1頂点のサイズ
- Usage
- この頂点バッファがGPUやCPUからどのように使われるか(アクセスされるか)をフラグ指定する。リードオンリーにしたりGPUだけに許可を与えたりなどができますが、特段理由が無ければD3D10_USAGE_DEFAULTを指定すればOKです。
- BindFlags
- このバッファがどういう種類のバッファであるかを指定します。頂点バッファであればD3D10_BIND_VERTEX_BUFFER、インデックスバッファであればD3D10_BIND_INDEX_BUFFERなどと項目が決まっています。今回は頂点バッファなのでD3D10_BIND_VERTEX_BUFFERです。
- CPUAccessFlags
- バッファに対するCPUのアクセス権限を指定します。書き込みを許可するならばD3D10_CPU_ACCESS_WRITE、読み込みを許可するならばD3D10_CPU_ACCESS_READを指定します。読み書き負荷にする場合は0を指定します。
- MiscFlags
- オプションです。Miscellaneous(雑多な)という意味の通りで特に理由が無ければ0でOKです。
typedef struct D3D10_SUBRESOURCE_DATA {
const void *pSysMem;
UINT SysMemPitch;
UINT SysMemSlicePitch;
} D3D10_SUBRESOURCE_DATA;
- pSysMem
- リソースとなるメモリブロックへのポインタを渡します。今回の場合ここには頂点配列の先頭ポインタ(vtx)が来ます。
- SysMemPitch
- リソースがテクスチャの場合にだけ使われる値です。これについて触りだけ説明しますと、DirectX10ではテクスチャリソースは「配列」として扱われます。ここで与える値はテクスチャ配列に登録された1枚のテクスチャのサイズです。要はこれでシステムがn番目の配列にアクセスするための頭出しが出来るようになるわけです。頂点リソースである場合、この値は無視されます。
- SysMemSlicePitch
- デプスレベルの大きさを与えます。デプスレベルというのは3Dテクスチャに関連する値です。頂点リソースの場合この値も無視されます。
最終更新:2008年10月06日 16:03