初期化で生成されるオブジェクト
D3D11CreateDeviceAndSwapChainでは下記を生成しています。
ID3D11Device | DirectX11の機能にアクセスするためのデバイス このデバイスから描画に必要なオブジェクトの生成などを行います。 |
---|---|
ID3D11DeviceContect | DirectX11では描画処理がこちらのデバイスコンテキストで行う形になっています。 このオブジェクトで描画コマンドの生成や発行を管理します。又、ImmediateとDeferredの2種類のコンテキストが存在します。 D3D11CreateDeviceAndSwapChainで生成されるのはImmediateです。Immediateではコマンドの生成からGPUへの発行まで行います。Deferredは使用する際に別途作成する必要があります。 遅延という意味ですがコマンドのみを作成してImmediateで作成したコマンドを後から実行することが可能です。これにより複数スレッドで並列して描画コマンドの生成などが可能になります。 |
IDXGISwapChain | レンダリング結果を出力するためのオブジェクトです。 紐づいたビデオアダプタやウィンドウに対してレンダリング結果を出力します。 |
これらのオブジェクトを生成するところからDirectX11の実装が始まります。
それでは生成する際に使用した情報を見ていきましょう。
DXGI_SWAP_CHAIN_DESC
BufferDesc | バックバッファの設定です。 バッファのサイズやフォーマット。 そしてリフレッシュレートなどが指定できます。 |
---|---|
BufferSampleDesc | MSAAを適応するための設定を行います。 ハードウェアに応じて使用できる品質が異なります。 なので使用する場合はデバイスで使用可能な性能を調べてから設定します。 |
BufferUsage | バッファの使用用途を設定します。 今回はシェーダからの出力先として使用するの下記を指定します。 DXGI_USAGE_RENDER_TARGET_OUTPUT |
BufferCount | バックバッファの数 |
OutputWindow | 出力先のウィンドウハンドル |
Windowed | ウィンドウモードで初期化するか? falseにするとフルスクリーンモードとなります。 |
SwapEffect | フロントバッファとバックバッファの入れ替え方法を設定できます。 詳細はDXGI_SWAP_EFFECTを確認してください。 |
Flags | スワップチェインの設定フラグを指定します。 詳細はDXGI_SWAP_CHAIN_FLAGを確認してください。 |
スワップチェインの生成に使用する設定は以上です。
DirectX9の頃と同じような内容です。
ただリフレッシュレートが細かく設定できるようになっています。
D3D11CreateDeviceAndSwapChain
pAdapter | 使用するビデオアダプタの設定します。 ※nullptrで規定のアダプタを使用 |
---|---|
DriverType | ドライバタイプの設定します。 基本的にハードウェア(D3D11_DRIVER_TYPE_HARDWEAR)を指定します。 |
Software | D3D_DRIVER_TYPE_SOFTWAREを指定した際に使用するモジュールを設定します。 |
Flags | 使用するフラグの設定します。 詳細はD3D11_CREATE_DEVICEを確認してください。 |
pFeatureLevels | 使用したい機能レベル(D3D_FEATURE_LEVEL)を指定できます。 指定した内容の上から順に初期化できるか実行されます。 nullptrの場合は使用可能な最高レベルが使用されます。 |
FeatureLevels | 上記で指定した機能レベルの要素数 |
SDKVersion | SDKのバージョン指定します。 必ずD3D11_SDK_VERSIONとなります。 |
pSwapChainDesc | 生成するSwapChainの設定です。 |
ppSwapChain | 生成したSwapChainの格納アドレスです。 |
ppDevice | 生成したDeviceの格納アドレスです。 |
pFeatureLevel | 生成に成功した機能レベルです。 |
ppImmediateContext | 生成したDeviceContectの格納アドレスです。 |
DirectX11を初期化するにはドライバタイプや機能レベルを指定してデバイスを生成します。
DirectX11となっていますが、実際にはDirectX10やDirectX9に制限をかけた状態で生成することもできます。
基本的にDirectX11が動作しない環境のための対処ですが、
最近のPCは基本的にDirectX11で動作するのでそこまで対応する必要があるかは考えものです。
今回についてはDirectX11.0のみでチェックして初期化するようにしています。
サンプルプログラム
今回のDirectX11の初期化はここまでです。
最初に記述したように割愛した部分も含めたサンプルコードをアップロードしているので必要に応じて参考にしてください。