008.頂点色とテクスチャの合成(Dx11版)
このサンプルは
SimplSample008というディレクトリに含まれます。
BaseCrossDx11.slnというソリューションを開くと
Dx11版が起動します。
実行結果は以下のような画面が出ます。
図0008a
動画は以下になります。
【サンプルのポイント】
今項のサンプルのポイントは
複数のシェーダによる、複数の描画のサンプルです。今項のサンプルには、シェーダは2種類含まれます。1つは前項までと同じ
VertexPositionTexture型を持ったオブジェクトの描画です。中心の流れるテクスチャですが、これは前項とかわりません。そしてあたらしく背景の壁に
VertexPositionColorTexture型の頂点を持ったオブジェクトを描画します。
これらを実装するのに
Dx12版と
Dx11版で実装方法を変えています。
Dx12版については、
描画クラスを階層的に作成し、それぞれの描画をそれらのクラスに任せます。
Dx11版については、それぞれのオブジェクトで、べたに描画します。
当然
Dx12版のような描画方法のほうが
オブジェクト指向なのですが、
Dx11版でも
Dx12版にならって描画クラスを作成してみると、勉強になると思います。
【共通解説】
Dx12、Dx11両方に共通なのは
シェーダーです。
DxSharedプロジェクト内に
シェーダファイルというフィルタがあり、そこに記述されてます。
今回使用するシェーダは
頂点シェーダとピクセルシェーダです。2種類のセットがあります。
VertexPositionTexture型の頂点を持つもの用と
VertexPositionColorTexture型のものです。
コンスタントバッファの2種類あります。
【Dx11版解説】
BaseCrossDx11.slnを開くと、
BaseCrossDx11というメインプロジェクトがあります。この中の
Character.h/cppが主な記述個所になります。
■初期化■
Dx11版の初期化は、
Dx12版のようにリソース初期化はありません。頂点バッファを作成し、スケール、位置などを初期化します。
その際、背景の壁は
VertexPositionColorTexture型になります。
■更新処理■
背景の壁は更新処理はありません。
流れるテクスチャは頂点バッファを
マップして、バックアップを展開しながら変更します。これは前項と同じです。
■描画処理■
描画処理は、
Dx11版は
Dx12版のような
描画クラスは持っていません。オブジェクトごとに描画してます。これは、明らかに効率が悪いです。新しいオブジェクトを作るたびに
描画処理を記述する形です。
ですので、ぜひ
Dx12版のように
描画クラスを作成して実装してみましょう。階層化にしなくても、まずは前項(Dx11版)のように、クラス化するだけでも汎用的になります。
【まとめ】
今回は
シェーダの違うオブジェクトを同居させる場合の、ヒントになるようなサンプルになってます。表現は前項とほぼ同じなので、比べてみると違いが判ると思います。
また、ここで知ってほしいのは
プログラム実装は一通りではないということです。描画処理1つとっても、クラスの設計や関数の書き方で、効率の良しあしが決まります。せっかくC++という自由度が高い言語を扱っているので、テンプレート、仮想関数など。C++の機能をふんだんに使って実装を試みましょう。