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++の機能をふんだんに使って実装を試みましょう。