27.複数のスプライトの描画

今回は1つのサンプルをGitHubにアップしましたSimpleSample004です。
ドキュメントは申し訳ないですが、まだ記述してません。少しサンプルがたまった段階でアップします。

この記事は、
コミットSimpleSample002,003追加。ライブラリ修正あり
から、
コミットSimpleSample004追加。ライブラリ修正あり
の間の作業です。
GitHubサイト

https://github.com/WiZFramework/BaseCross

を参照して下さい。

また、ブログ記事全体に、Dx12に関する研究、考察がよく出てきます。
Dx12に関する情報は、マイクロソフト社のDirectX-Graphics-Samplesが主な情報源となります。

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

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

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

SimpleSample004について

実行結果は以下のようになり、これはDx11版もDx12版も変わりません。

2016082101

このサンプルのテーマは複数の四角形スプライトをコンスタントバッファにより動かすということです。
複数の同じオブジェクト(複数のインスタンス)を管理する場合、いろんな方法があると思います。
まず、単純に前項SimpleSample003に紹介したようなオブジェクトを、シーン上に複数配置する方法。
この方法だと、構築は簡単ですが、それらのオブジェクト同士の関係をどこかで管理せねばならす、例えばシーンで管理したりする必要があります。
もう一つの方法は、シーンに配置するオブジェクトは一つですが、その中でコンスタントバッファを管理する配列を作成し、その中で、複数管理する方法があります。
今回は後者の方法です。こちらの構造のほうが前者よりもそれぞれのオブジェクトの関係を扱いやすいと思います。

ライブラリ的な側面から言うと、コンスタントバッファをどのように管理するかというのが悩めるところです。
Dx11版の場合、同じシェーダで使うコンスタントバッファは一つです。シングルトンになっていて、そのシェーダを使うオブジェクトはそのシングルトンなコンスタントバッファを使いまわします。

しかしDx12版はライブラリの設計上、コンスタントバッファは各オブジェクトが持つという形になっています。これは、バックバッファへの描画をコマンドリストで実装するので、コマンドリストが実行されるまで、コンスタントバッファの内容は維持されなくてはならないからです。
ですので今回のサンプルでは、Dx12版は複数のオブジェクトに描画コンテキストをそれぞれ持たせています。
描画コンテキストは中でルートシグネチャを持つので、オブジェクトの数だけルートシグネチャが存在する形になります。
これは明らかに助長的です。
そのため、一番いいのはバンドルという方法で1つのルートシグネチャで複数のコンスタントバッファを持つ方法ですが、現時点でライブラリが追いついてないので、これは今後の課題となります。
ただ、バンドルはDirectX-Graphics-Samplesを確認すると(まだテクニックを見つけてないだけかもしれないが)、初期化時にバンドルする数を決めなくてはいけません。
BaseCross動的なオブジェクトの追加に耐えなければなりません。最初に配置する総オブジェクト数を決めるわけにはいかないのです。
ですので、動的にルートシグネチャの変更ができるのかどうか、を確認しないとならない(もちろんその操作にかかる、スピードダウンの負荷も最小限にしなければならない)です。
このあたりは、現時点でライブラリの不備なので、将来は修正が必要でしょう。
今回のコミットでいくつかのライブラリ修正がありますが、それはその準備のようなものです。

もう一つ、かなり速い方法としてインスタンス描画があります。
これは入力スロットに複数のワールド行列を入れるもので、これはかなり速いです。しかし、この方法は、ワールド行列以外のコンスタントバッファの内容はスロットに入れられないので、例えばオブジェクトごとにエミッシブ色を変更みたいなことはできません。あくまで変えられるのはワールド行列のみになります。
なおインスタンス描画のサンプルは後ほど紹介します。

このように、現時点で固まっていないDx12版の複数描画ですが、このサンプルはそのバージョン1と考えていただいたほうがいいかもしれません。ですので将来、サンプルそのものが(ライブラリ部分だけでなく)修正される可能性もあります。

つらつらと述べてきましたが、いま、僕が悩んでいるのは、以下の点です


1、Dx11版はコンスタントバッファはシングルトンで使用している。
2、であるが、問題なく複数描画できる。これは、Dx11が内部で、
 描画命令と同時にバックバッファに転送しているからと思われる。
3、Dx12における2のようなテクニックを現時点で実装できてない。
 強制的に、描画途中でコマンドリストの実行をしても、反映されない。
4、これは、僕のバグと思われるが、そこがまだ原因究明できていない。
5、そのためDx12では、複数のオブジェクトに対して複数のルートシグネチャが存在させる方法で
 現時点は実装している
6、これは助長的で、将来変更しなければならない

こんなとこでしょうか。
実験と実装とは、悩める部分も正直に告白しましょうということで書いてますが、こうして並べてみると、あまり格好良くないですね。早く直さなくちゃ。

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

カテゴリー

ピックアップ記事

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