DX10:構造体




DXGI_SWAP_CHAIN_DESC

スワップチェインの記述

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です。このフラグを指定するとフルスクリーン⇔ウィンドウモードの切り替えができるようになり、切り替え時のあれやこれやを自動的に行ってくれます。



DXGI_MODE_DESC

ディスプレイモードの記述

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を指定しても良いかなと思います。



DXGI_SAMPLE_DESC

マルチサンプリングパラメータの記述

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となっている。
マルチサンプルアンチエイリアシングを使う場合、全てのレンダリングターゲットとデプスバッファは同じcountqualityを持たなければならない。

Direct3D 10.0と10.1の違い
10.1になって、2つの新しいクオリティレベルが定義された
D3D10_STANDARD_MULTISAMPLE_PATTERN
D3D10_CENTER_MULTISAMPLE_PATTERN



D3D10_RENDER_TARGET_VIEW_DESC

レンダーターゲットのアクセスに使うリソースのサブリソースを特定する

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



D3D10_VIEWPORT

ビューポートのディメンジョンを定義

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



D3D10_INPUT_ELEMENT_DESC

アセンブラ入力ステージ用の単一要素の記述

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にしなければなりません。



D3D10_PASS_DESC

パイプラインステートを含むエフェクトパスの記述

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ブレンド要素



D3D10_BUFFER_DESC


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です。



D3D10_SUBRESOURCE_DATA


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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。