Dx11からDx12への引っ越し編その②
皆さんこんにちは。
フルスクラッチでゲームエンジンを作ろう!第三回です。
前回書いた通り、テクスチャの貼り付けまでやって
Dx11でできること=Dx12でできることにするのが今回の目標です。
ちなみに今はこんな感じ。
前回と同じくDx11用に作ってあるクラスと同じ役目、責任を持つクラスを実装していきます。
といっても前回の時点で描画に必要なクラスはほぼ作ってあるので、テクスチャデータの作成と保持を担うResource_Texture_Dx12の作成と、デスクリプタヒープの設定し直し等をするのみです。
なお今回のテクスチャ貼り付けに限らず、私はいつも
これらのサイトを参考にしています。
まずはResource_Texture_Dx12の作成。
Resource_Texture_Dx12は
ID3D12Resource×2 //テクスチャのデータを保持するリソースとGPUにアップロードするためのリソース
vector<uint8_t> //ファイルから読み取ったデータそのもの
D3D12_RESOURCE_DESC//テクスチャ用のデスクプリタ
等のテクスチャからシェーダーリソースビューを制作するのに必要なオブジェクトを持ちます。
コンストラクタでテクスチャのデータとタテヨコのサイズを受け取り、そこからテクスチャのリソースとアップロードヒープを作成します。
テクスチャのデータからリソースを作るのは今回こちらのライブラリを参考にしました。
MicroSoftが提供している、簡単にファイルからデータを読み込みリソースにしやすくしてくれるライブラリです。
フルスクラッチにこだわらないのであれば、初心者だろうと誰だろうとお勧めできるものです。
今回私はこれの中身を見てデータをうまく加工する方法を学びました。
ファイルからデータを読み込むのは前回制作したResourceFactory_Dx12クラスの仕事です。
基本的に、ファイルだったりの外部情報からリソースを生成する場合データを吸い出す責任とデータからリソースを構築する責任は分けておいた方がいいです。
で、ResourceFactory_Dx12クラスが具体的にどう吸い出してるかというと、Windows Imaging Componentという、Windows SDKに含まれている画像読み書き用のAPIをつかっています。
IWICImaginFactory オブジェクトの生成
IWICImaginFactory オブジェクトからdecoderを生成
decoderからのframeの生成
frameからの画素の取得
という流れで画像を取得できます。
ただこれはWindowsでしか使えない上、フルスクラッチ名乗ってるのにSDKのAPI使うのか?という問題も発生します。
Dx12の習得を優先しているため今回はこの手段をとりましたが、近いうちに自力で画像の読み書きができるAPIを作ろうと思います。
話を戻して、アップロードヒープを作ることができたらD3D12_SUBRESOURCE_DATAにテクスチャのデータをうつし、初めて描画されるフレームにてUpdateSubresources関数を使ってアップロードヒープに渡します。
これでResource_Texture_Dx12は完成です。
次にMeshDrawData_Dx12のコンスタントバッファビューアップロードヒープをコンスタントバッファビューシェーダーリソースビューアップロードヒープに変更します。
コンスタントバッファビューとシェーダーリソースビューは別々に設定することが出来ないので一つにまとめるのです。
単純にD3D12_DESCRIPTOR_HEAP_DESCのNumDescriptorsを2に変えるだけで二つ分の領域が確保されます。
その後、コンスタントバッファビューを作る際にデスクリプタヒープ一つ分領域を開けて生成するようにします。
メモリ上の同じところに作ると正常に値が渡されなくなるので。
次にサンプラーのデスクリプタヒープですが、D3D12_DESCRIPTOR_HEAP_DESCのTypeを D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLERにして、好きなように生成するだけです。
あとはGPUに渡すデスクリプタヒープのハンドルの配列に忘れずに加えて、シェーダーリソースビューを作成すれば…
テクスチャの貼られた単純な図形が表示されました。
これは調子に乗ってブレンド設定をいじったもの。
こんな感じでDx11とDx12で切り替えても、同じように描画されます。
というわけで、今回の目標は達成できました。
次回は頂点情報の扱いをもっと便利にしていく工夫をしていきたいと思います。
これまではどれも私の作ったクラスがどーのという話が多く役に立つ人がほぼいない話でしたが、次こそは低級描画APIを使っている方々全般の役に立つ記事を書くつもりです。
最後まで読んで頂きありがとうございました。それでは。
この記事が気に入ったらサポートをしてみませんか?