Direct3D 10.0デバイスとスワップチェインの生成
HRESULT D3D10CreateDeviceAndSwapChain(
IDXGIAdapter *pAdapter,
D3D10_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
UINT SDKVersion,
DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,
IDXGISwapChain **ppSwapChain,
ID3D10Device **ppDevice
);
- pAdapter [IN]
- ディスプレイアダプタ(要はビデオカード)を表すIDXGIAdapterインターフェイスを渡す。これはビデオカードを2枚差している場合などにどちらかのビデオカードを指定する場合などに使いう。普通はプライマリビデオカードで良いのでNULLでオッケー。
- DriverType [IN]
- 描画をハードウェアで行う(D3D10_DRIVER_TYPE_HARDWEAR)かソフトウェアで行う(D3D10_DRIVER_TYPE_REFERENCE)かを指定する。サポート環境を仮定するならD3D10_DRIVER_TYPE_HARDWEARで。D3D10_DRIVER_TYPEには他にもD3D10_DRIVER_TYPE_SOFTWAREとかもあるが、今後のために予約されているので指定できない。
- Software [IN]
- DriverTypeにD3D10_DRIVER_TYPE_SOFTWAREというフラグを立てた時に必要なソフトウェアラスタライザを実装したDLLを指定する。現時点ではこのフラグは立てられないのでNULLを指定することになる。もし指定する時期がやってきたら、DLLのモジュールハンドルはWinAPIのLoadLibrary, LoadLibraryEx, GetModuleHandleなどで取得することができる。
- Flags [IN]
- Direct3D10(コア)が使うAPIの種類や使い方を決めます。デフォルト(ハードウェアAPI)
- で良いなら0で構いません。D3D10_CREATE_DEVICE_SINGLETHREADEDにするとシングルスレッドAPIになります。DirectXはスレッドセーフなマルチスレッドをサポートしているのでこれを指定する事はあまりありません。D3D10_CREATE_DEVICE_DEBUGにするとデバッグや妥当性検証が入ったAPIが使われます。デバッグ環境ではより詳細なエラー情報が得られます。D3D10_CREATE_DEVICE_SWITCH_TO_REFにするとハードウェアAPIとリファレンスAPIとが切り替わる環境になります。これはデバッグする時に役立ちます。
- SDKVersion [IN]
- DirectXのSDKバージョンを渡します。これはよほどの理由が無い限りはD3D10_SDK_VERSIONにして下さい(マニュアルにはD3D_SDK_VERSIONと記載されていますがミスプリです、多分)。
- pSwapChainDesc [IN]
- スワップチェインの能力を登録したDXGI_SWAP_CHAIN_DESC型の変数へのポインタを渡す。
- ppSwapChain [OUT]
- IDXGISwapChainインターフェースのアドレス
- ppDevice [OUT]
- ID3D10Deviceインターフェースのアドレス
ファイルからエフェクトを生成
HRESULT D3DX10CreateEffectFromFile(
LPCTSTR pFileName,
CONST D3D10_SHADER_MACRO *pDefines,
ID3D10Include *pInclude,
LPCSTR pProfile,
UINT HLSLFlags,
UINT FXFlags,
ID3D10Device *pDevice,
ID3D10EffectPool *pEffectPool,
ID3DX10ThreadPump *pPump,
ID3D10Effect **ppEffect,
ID3D10Blob **ppErrors
HRESULT *pHResult
);
- pFileName [IN]
- ASCII文字列でエフェクトファイル名を指定。コンパイラの設定がUnicodeの場合はLPCTSTRをLPCWSTRとして引数を指定。それ以外の場合はLPCSTRでいい。
- pDefines [IN]
- NULLでターミネイトされたシェーダーマクロの配列(D3D10_SHADER_MACROを参照)。NULLを指定すればマクロは使用しないという事。
- pInclude [IN]
- インクルドインターフェースのポインタ(ID3D10Includeインターフェースを参照)。このパラメータはNULLにでもよい。
- pProfile [IN]
- シェーダーモデルを指定するための文字列。DirectX10.0ならfx_4_0になる。
- HLSLFlags [IN]
- HLSLコンパイルオプション。HLSLとは上位レベルシェーダー言語
- FXFlags [IN]
- エフェクトコンパイルオプション。
- pDevice [IN]
- ID3D10Deviceのポインタ
- pEffectPool [IN]
- ID3D10EffectPoolのポインタ(エフェクト間の変数を共有するためのもの)
- pPump [IN]
- ID3DX10ThreadPumpのポインタ。NULLを指定することで、関数は処理が終わるまでリターンしない
- ppEffect [OUT]
- 生成されたID3D10Effectのポインターのアドレス
- ppErrors [OUT]
- エフェクトコンパイルにエラーが生じた場合にその情報を格納するメモリのアドレス
- pHResult [OUT]
- 何かの結果が入るらしい…。マニュアルにも書いてないし。
デバイスに割り当てるフォントオブジェクトの作成
HRESULT D3DX10CreateFont(
ID3D10Device *pDevice,
INT Height,
UINT Width,
UINT Weight,
UINT MipLevels,
BOOL Italic,
UINT CharSet,
UINT OutputPrecision,
UINT Quality,
UINT PitchAndFamily,
LPCTSTR pFaceName,
LPD3DX10FONT *ppFont
);
- pDevice [IN]
- フォントに関連付けられるデバイス
- Height [IN]
- 論理単位の文字の高さ
- Width [IN]
- 論理単位の文字の幅
- Weight [IN]
- 書体のウェイト。例えばボールドとか。WinGDI.hで定義されているFW_XXXXで指定
- MipLevels [IN]
- ミップマップレベル。ミップマップを使わない場合は1を指定。0にすると 1x1 レベルまでのミップマップチェーンを作成する。
- Italic [IN]
- 斜体ならTRUEにする
- CharSet [IN]
- キャラセット。国とか文字のエンコードとかを指定するっぽい。WinGDI.hで定義されているXXXX_CHARSETで指定する。
- OutputPrecision [IN]
- ウィンドウズがフォントのサイズや形状を決める手段を指定。例えばOUT_TT_ONLY_PRECISを指定すれば、常にTrueTypeフォントを使用することになる。フラグはWinGDI.h内にOUT_XXXXという形で定義されている。
- Quality [IN]
- 生成するフォントをリアルフォントにどれだけ近づけるかという手段。つまりその名のとおりクオリティの指定。この設定はラスターフォント(非TrueType。つまりドットテクスチャ)にのみ適用され、TrueTypeフォントには影響しない。
- PitchAndFamily [IN]
- フォントのピッチとファミリのインデックス
- pFaceName [IN]
- フォント名
- ppFont [OUT]
- 生成されたフォントオブジェクトを表すID3DX10Fontインターフェースのポインタ。
スワップチェインのバックバッファにアクセス
HRESULT GetBuffer(
UINT Buffer,
REFIID riid,
void **ppSurface
);
- Buffer [IN]
- 0から始まるバッファインデックス。スワップエフェクトがDXGI_SWAP_EFFECT_SEQUENTIALでない場合はこのメソッドは先頭バッファにのみアクセスするので、その場合はインデックスは0で固定
- riid [IN]
- バックバッファのインターフェースを示すGUIDを指定。__uiidof()を使って指定するとよい
- pSurface [IN,OUT]
- バックバッファインターフェースのポインタ
レンダーイメージをスクリーンに描画
HRESULT Present(
UINT SyncInterval,
UINT Flags
);
- SyncInterval [IN]
- そのフレームでのV-Blankでの同期方法を指定する。0を指定すると同期は行わず、即時描画を行う。1,2,3,4を指定すると、n番目の垂直同期の後に描画が行われる。
- Flags [IN]
リソースデータにアクセスするためのレンダーターゲットビューを生成
HRESULT CreateRenderTargetView(
ID3D10Resource *pResource,
const D3D10_RENDER_TARGET_VIEW_DESC *pDesc,
ID3D10RenderTargetView **ppRTView
);
- pResource [IN]
- レンダーターゲットとして使われるリソースであるID3D10Resouceインターフェイスへのポインタ。このリソースはあらかじめ D3D10_BIND_RENDER_TARGETフラグを使って生成されていなければならない。
- pDesc [IN]
- デプス/ステンシルビューの記述用構造体 {D3D10_RENDER_TARGET_VIEW_DESC)のポインタ。このパラメータをNULLにして生成されたビューはリソース全体を通してミップマップレベル0のアクセスとなる(リソースが生成されたときのフォーマットを使う)。とりあえず、デフォルト設定でよいのならNULLを指定すればよい。
- ppRTView [OUT]
- ID3D10RenderTargetViewのポインタのアドレス。
1つ、もしくは複数のレンダーターゲット、デプスステンシルバッファーをしアウトプットマージャーステージにバインドする(OM = OutputMerger)
アウトプットマージャーステージというのはそのままマニュアルから引っ張ってきた単語だが、意味としてはパイプラインステート(ピクセルシェーダーから生成されたピクセルデータ、レンダーターゲットの内容、デプス/ステンシルバッファの内容)の結合により得られる最終的なピクセルカラーを生成するステージのこと。
void OMSetRenderTargets(
UINT NumViews,
ID3D10RenderTargetView *const *ppRenderTargetViews,
ID3D10DepthStencilView *pDepthStencilView
);
- NumViews [IN]
- 割り当てるレンダーターゲットの数
- ppRenderTargetViews [IN]
- デバイスに割り当てるレンダーターゲットの配列のポインタ。このパラメータにNULLを指定するとレンダーターゲットがバインドされていないことになる。
- pDepthStencilView [IN]
- デバイスに割り当てるデプス/ステンシルビューのポインタ。NULLなら割り当てされていないということに。
ビューポート配列をパイプラインのラスタライザステージに割り当てる(RS = Rasterizer Stage)
void RSSetViewports(
UINT NumViewports,
const D3D10_VIEWPORT *pViewports
);
- NumViewport [IN]
- 割り当てるビューポートの数
- pViewports [IN]
- デバイスに割り当てるビューポート配列。それぞれのビューポートが以下の許容範囲内の値を持たなければならない(D3D10_VIEWPORT_BOUNDS_MIN, D3D10_VIEWPORT_BOUNDS_MAX, D3D10_MIN_DEPTH, D3D10_MAX_DEPTH)
インプットアセンブラステージ用の入力バッファデータの記述をするための入力レイアウトオブジェクトを生成する
HRESULT CreateInputLayout(
const D3D10_INPUT_ELEMENT_DESC *pInputElementDescs,
UINT NumElements,
const void *pShaderBytecodeWithInputSignature,
SIZE_T BytecodeLength,
ID3D10InputLayout **ppInputLayout
);
- pInputElementDescs [IN]
- D3D10_INPUT_ELEMENT_DESCによって記述された入力データタイプの配列
- NumElements [IN]
- 入力データ配列の要素数
- pShaderBytecodeWithInputSignature [IN]
- コンパイル済みのシェーダコードへのポインタ。これはすでにエフェクトインターフェイスを生成した時にできているのでパス情報を取得し、それを引数に与えればよい。
- BytecodeLength [IN]
- コンパイル済みシェーダコードの長さ。同様にパス情報に含まれているのでそれを渡す
- ppInputLayout [OUT]
- 入力レイアウトオブジェクトへのポインタが格納される。他の入力パラメータを有効にする場合はこのポインタをNULLにし、関数の返り値がS_FALSEになることを確認する必要がある。要するに、入力レイアウトを切り替えたい場合は、このメソッドで一度ppInputLayout = NULLにしてリセットする必要があるということかな?
バッファの生成(頂点バッファ、インデックスバッファ、シェーダー定数バッファ)
HRESULT CreateBuffer(
const D3D10_BUFFER_DESC *pDesc,
const D3D10_SUBRESOURCE_DATA *pInitialData,
ID3D10Buffer **ppBuffer
);
- pDesc [IN]
- D3D10_BUFFER_DESCへのポインタ
- pInitialData [IN]
- D3D10_SUBRESOURCE_DATAへのポインタ
- ppBuffer [OUT]
- 生成されたバッファのインターフェースのアドレス
頂点バッファ配列を入力アセンブラステージに割り当てる。
注意したいのは頂点バッファとしての配列ではなく、各頂点バッファの配列を渡すという点。
なので、pStride や pOffset もそれぞれの頂点バッファに対応すべくポインタ渡しとなっている。
void IASetVertexBuffers(
UINT StartSlot,
UINT NumBuffers,
ID3D10Buffer *const *ppVertexBuffers,
const UINT *pStrides,
const UINT *pOffsets
);
- StartSlot [IN]
- 最初に割り当てる入力スロット。最初の頂点バッファは明確にスタートスロットに割り当てられなければならない。他の頂点バッファを追加する場合はサブシーケンス入力スロットに割り当てる必要がある。入力スロット数は16ある。
- NumBuffers [IN]
- 頂点バッファ配列の要素数。頂点バッファのサイズではないので注意。複数の頂点バッファをまとめて配列として登録できるので、この引数が必要となっている。この数は入力スロット数を上回ることはできない。
- ppVertexBuffers [IN]
- 頂点バッファ配列のポインタ。頂点バッファは必ずD3D10_BIND_VERTEX_BUFFERフラグを立てた状態で生成されなければならない。
- pStrides [IN]
- 各頂点バッファの要素の読み込み単位。基本的には頂点バッファを構成する頂点要素の構造体サイズとかを渡せばよい。
- pOffsets [IN]
- 各頂点バッファにおいて、頂点バッファ先頭から最初の頂点要素へのオフセット。ヘッダとかが存在する場合はきっと非0の値が入るハズ。
入力データのプリミティブタイプ・オーダーを指定
void IASetPrimitiveTopology(
D3D10_PRIMITIVE_TOPOLOGY Topology
);
- Topology [IN]
- プリミティブタイプ・プリミティブデータのオーダー(D3D10_PRIMITIVE_TOPOLOGYで指定)
レンダーターゲットの全要素を単一の値にする(要するに指定色で塗りつぶす)
void ClearRenderTargetView(
ID3D10RenderTargetView *pRenderTargetView,
const FLOAT ColorRGBA[4]
);
- pRenderTargetView [IN]
- レンダーターゲットのポインタ
- ColorRGBA [IN]
- レンダーターゲットを塗りつぶすための4つの色要素(RGBA)
非インデックス、非インスタンスドなプリミティブの描画
void Draw(
UINT VertexCount,
UINT StartVertexLocation
);
- VertexCount
- 描画する頂点の数
- StartVertexLocation
- 最初の頂点のインデックス。主に頂点バッファ内のオフセット。インデックスはシェーダーパラメータの最初の頂点IDとしても使われる。
リソースデータのポインタを取得し、その間のそのリソースへのGPUアクセスを抑制する
HRESULT Map(
D3D10_MAP MapType,
UINT MapFlags,
void **ppData
);
- MapType [IN]
- CPUからのデータアクセスタイプを指定。D3D10_MAPで指定する。
- MapFlags [IN]
- GPUがビジー状態のときのCPUの挙動を指定。D3D10_MAP_FLAGで指定する。このフラグはオプション。
- ppData [OUT]
- リソースデータへのポインタ
- 返り値
- 成功するとS_OKを返す。いくつかの理由によりこのメソッドは失敗する
・MapType を D3D10_MAP_FLAG_DO_NOT_WAITに指定し、取得先のリソースにまだGPUがアクセスしていた場合は E_WASSTILLRENDERRINGを返す
・アクセスしようとしたリソース先が格納されているハードウェアデバイスが(例えばビデオカードとか)消失してしまった場合は E_DEVICEREMOVEDを返す
- 備考
- CPUからリソースの内容に書き込みを行う場合は、そのリソースは D3D10_USAGE_DYNAMICフラグを指定して生成されていなければならない。読み込みと書き込みの両方を行う場合はD3D10_USAGE_STAGINGを指定して生成する必要がある。このメソッドはリソースデータへのポインタを取得する。効率的なリソースへのアクセスについては Copying and Accessing Resource Dataを参照。
ID3D10Buffer::Unmapを使ってリソースへのアクセスが終了したことを明示的に知らせる。
このメソッドには他にも制限がある
・同時に同じバッファのマッピングができない。言い換えれば、すでにマップ済みのバッファに対してこのメソッドをコールしてはならない
・パイプラインに関連付けられたバッファは描画処理を実行する時までにはアンマップ状態でなければならない。要するにマップ状態で描画処理をしてはならない
名前からテクニックを取得
ID3D10EffectTechnique* GetTechniqueByName(
LPCSTR Name
);
- Name [IN]
- テクニックの名前
- 返り値
- ID3D10EffectTechniqueインターフェースのポインタ。見付からない場合はNULL
名前から変数を取得
ID3D10EffectVariable* GetVariableByName(
LPCSTR Name
);
- Name [IN]
- 変数名
- 返り値
- ID3D10EffectVariableインターフェースのポインタ
- 備考
- エフェクトは1つ以上の変数を含んでいることがある。テクニックの外側に定義されている変数はエフェクト全体のグローバル変数として考えられ、テクニックの内側で定義されている変数はそのテクニックの中だけで有効である(Cのスコープと同じ)。エフェクト変数は名前、もしくはインデックスでアクセスすることができる。
指定した名前の変数が存在しなくても、インターフェースのポインタは取得できるようなので、NULLチェックとかする必要はない。むしろ必要なのは指定した型のデータがインターフェースに存在するかどうかのチェックを行うこと。
いちおう、インターフェースポインタを取得した段階で、IsValid()メソッドを使うことで、指定した名前の変数の有無を確認することができる。
インデックスからパスを取得する。パスは1つのテクニックに複数存在する。パスの構成は例えば頂点シェーダ -> ジオメトリシェーダ -> ピクセルシェーダ のような一連の処理。
ID3D10EffectPass* GetPassByIndex(
UINT Index
);
- Index [IN]
- ゼロベースのインデックス
- 返り値
- ID3D10EffectPassインターフェースのポインタ
パス名からパスのインターフェースを取得
ID3D10EffectPass* GetPassByName(
LPCSTR Name
);
- Name [IN]
- パスの名前
- 返り値
- ID3D10EffectPassインターフェースのポインタ
パスの詳細を取得
HRESULT GetDesc(
D3D10_PASS_DESC *pDesc
);
- pDesc [IN]
- D3D10_PASS_DESCへのポインタ
- 返り値
- 結果を表すHRESULT値
パスをデバイスに関連付ける
HRESULT Apply(
UINT Flags
);
- Flags [IN]
- 未使用
スカラー値を取得
ID3D10EffectScalarVariable* AsScalar();
- 返り値
- ID3D10EffectScalarvariableインターフェースへのポインタ
テキストの表示
INT DrawText(
LPD3DX10SPRITE pSprite,
LPCTSTR pString,
INT Count,
LPRECT pRect,
UINT Format,
D3DXCOLOR Color
);
- pSprite [IN]
- 描画に使うスプライト。
「NULL」の場合、内部のスプライトオブジェ(システム側が用意する)を使って文字列を描画する。
- pString [IN]
- 描画する文字列。
「Count」が -1 の場合、「NULL」で終端する文字列でなければならない。
- Count [IN]
- 文字列の文字数。-1 の場合、文字数を自動的に計算する。
- pRect [IN][OUT]
- テキストを描画する矩形。
FormatにDT_CALCRECTを指定した場合はここに表示する文字列の矩形サイズが計算され、出力される。
- Format [IN]
- 領域内への描画方法。以下のフラグを任意に組み合わせることができる。
- Color [IN]
- テキストの色。
| DT_BOTTOM |
矩形の底部でテキストを両端揃えにする。必ず「DT_SINGLELINE」と組み合わせる。 |
| DT_CALCRECT |
指定したテキストが描画される矩形の幅と高さを計算する。描画はしない テキストが複数行の場合、最後の行が含まれるように矩形の底辺を修正。 テキストが1行の場合、行の最後の文字が収まるように矩形の右辺を修正。 |
| DT_CENTER |
矩形内でテキストを水平方向で中央揃えにする。 |
| DT_EXPANDTABS |
タブ文字を拡張する。タブの文字数は8字。 |
| DT_LEFT |
テキストを左揃えにする。 |
| DT_NOCLIP |
クリッピングせずに描画する。やや高速に描画される。 |
| DT_RIGHT |
テキストを右揃えにする。 |
| DT_RTLREADING |
右から左の順に読むようにテキストを表示する。 |
| DT_SINGLELINE |
テキストを1行で表示する。改行と行送りを無視。 |
| DT_TOP |
テキストの上端を揃える。 |
| DT_VCENTER |
上下方向でテキストを中央揃えにする(1行のみ)。 |
| DT_WORDBREAK |
語と語の間で自動的に改行される。改行/行送りのシーケンスも改行する。 |
最終更新:2008年11月05日 15:44