24.Dx12描画処理まとめ

今回は、これまでだらだら書き綴ってきましたDx12描画処理を少しまとめたいと思います。
具体的には19.Dx12デバイスの実装開始!から23.コマンドリストと描画処理までに紹介した内容をまとめたものです。

Dx12に関する情報は、マイクロソフト社のDirectX-Graphics-Samplesが主な情報源となります。

マイクロソフト社のDirectX-Graphics-SamplesのGitHubサイトは以下になります。

https://github.com/Microsoft/DirectX-Graphics-Samples

ぜひ、興味ある方はダウンロードしてみてDx12研究を始めるといいと思います。

この記事は、
コミットDx11、Dx12両頂点定義とプリミティブメッシュ作成の追加
から、
コミットweak_ptrからshared_ptr取得方法の修正
の間の作業です。
GitHubサイト

https://github.com/WiZFramework/BaseCross

を参照して下さい。
その間にいくつかのコミットがありますが、後ろのコミットを開いていただいてそれと合わせ読んでいただくとわかりやすいと思います。

Dx12の初期化

まず、初期化処理です。BaseCrossでのDx12デバイスDx12LibプロジェクトDeviceResources.h/cppに記述があります。
この中のImplイディオムにあるDeviceResources::Impl::CreateDeviceResources関数が初期化処理になります。
初期化処理で行っているのは以下の内容です。


1、DXGIFactoryの作成
2、アダプタの取得(ハードウェアアダプタを取得できるか検証して、失敗したらラップアダプタを所得)
3、コマンドキューの作成
4、スワップチェーンの作成
5、レンダーターゲットビューのデスクプリタヒープ作成
6、デプステンシルビューのデスクプリタヒープ作成
7、レンダーターゲットビューの作成
8、デプステンシルビューの作成
9、コマンドアロケータの作成
10、空のルートシグネチャの作成
11、画面クリア用のコマンドリストの作成
12、プレゼント用のコマンドリストの作成
13、同期オブジェクトの作成と同期処理

描画するオブジェクトの初期化

描画するオブジェクトはBaseCrossDx12プロジェクトCharacter.h/cppに記述があります。
この中の NormalTextureBox::OnCreate関数がその処理になります。
Dx12関連の初期化は以下になります。


1、テクスチャの作成
*テクスチャリソースの作成
*テクスチャのアップロードヒープの作成
2、コンスタントバッファとシェーダーリソースビューのためのデスクプリタヒープの作成
3、サンプラーデスクプリタヒープの作成
4、ルートシグネチャの作成
5、GPU側デスクプリタヒープのハンドルの配列の作成
6、コンスタントバッファの作成
*コンスタントバッファのアップロードヒープの作成
*コンスタントバッファビューの作成
7、オブジェクト描画用のパイプラインステートの作成
8、オブジェクト描画用のコマンドリストの作成
9、コンスタントバッファのアップロードヒープの更新
10、テクスチャのシェーダーリソースビューの作成

ターンごとのオブジェクトの描画

ターンごとに各オブジェクトに描画する機会が与えられます。以下は、1つのオブジェクトの描画処理です。

1、コンスタントバッファの更新
2、コマンドリストのリセット
3、頂点データの更新
4、テクスチャデータの更新
5、コマンドリストへのデスクプリタヒープの登録
6、コマンドリストへのGPU側へデスクプリタヒープハンドルの登録
7、コマンドリストへのビューポートの設定
8、コマンドリストへのシザー矩形設定
9、コマンドリストへレンダーターゲットビューとデプスステンシルビューの設定
10、コマンドリストへ描画方式の設定
11、コマンドリストへインデックスバッファの設定
12、コマンドリストへ頂点バッファの設定
13、コマンドリストへ描画処理の設定
14、コマンドリストのクローズ
15、コマンドリストを、デバイスに積み上げ

ターンごとコマンド実行とプレゼント処理

ここでは、各オブジェクトから積みあがったコマンドリストを一気に実行し、フロントバッファとバックバッファを変えることでプレゼント処理をします

1、バリアを張るコマンドリストの積み上げ
2、コマンドリストの実行(積みあがったコマンドリストを実行することで描画する)
3、プレゼント処理
4、プレゼント処理の終了の同期をとる
5、積みあがったコマンドリストのクリア

こうしてまとめてみると、たしかにただ、立方体を表示するだけに、かなりなソースを記述しなければならないのがわかります。
ただこうした記述は永遠に大変なことではありません。それは、例えばVSPSDrawContextクラスのようなクラスで、一連の処理をカプセル化できますし、またVSPSDrawContextクラスが気に入らなければ、自分で同様のクラスを作成し、各オブジェクトで実装も可能です。

また、こうしてハードウェアに近いところの操作を自分で書くことにより、間違いなくGPUに関する知識は広まりますし、その知識は、実際にゲームを作成していても、何かイレギュラー的な処理が必要な時に、間違いなくアイディアの引き出しとして利用可能になると思います。

まとめのまとめ

ここまで、コミットweak_ptrからshared_ptr取得方法の修正への更新をかなり多くの記事を割いて説明してきました。
まだ、説明不足なところもありますが、このコミットはこのくらいにして、次からは、サンプルの作成にかかりたいと思います。
DxBase2015やDxBase2016を体験済みな人はわかりますが、これらのフレームワークは、サンプルとドキュメントによって、使用方法や仕組みを説明しています。BaseCrossも例外ではなく、これから、サンプルの作成とその説明を始めたいと思います。

で、まずは三角形の描画です。ここまで3Dオブジェクトとしての立方体を説明してきましたが、BaseCrossはいろんなタイプのオブジェクトを描画する必要があります。3Dオブジェクトとしての立方体は、その1タイプにすぎません。

ではまた。次回からもよろしくお願いします。

カテゴリー

ピックアップ記事

  1. 2016092201
    今回は前回のサンプルを少し機能を追加しまして、いろんなオブジェクトを追加しています。FullTuto…
  2. 2016092001
    前回更新から時間がたってしまいましたが、今回はフルバージョンチュートリアル003をアップしました。内…
  3. eyecatch
    前回更新から時間がたってしまいましたが、今回はフルバージョンチュートリアル002で懸案となっていまし…
PAGE TOP