DirectXTex : Direct3D12でのDDSのロード

はじめに

前回の記事ではDirectXTexのOpenEXR対応について書きましたが,今回はDirectXTexに含まれるローダーのコードを使ってDDSのロード処理を取り扱います.

今回は,DirectXTexの中にあるDDSTextureLoaderのうちDDSTextureLoader12.hとDDSTextureLoader12.cppの2つのソースを持ってきます.

https://github.com/Microsoft/DirectXTex/tree/master/DDSTextureLoader

今回のサンプル

今回のファイルはDDS(サンプルでは圧縮形式はBC7です)を四角形ポリゴンだけのものです.

今回のコードのベースになっているのはMicrosoftのサンプルコードです.このサンプルでは三角形に,関数で生成したチェッカーのテクスチャを貼っていますが,今回のサンプルはポリゴンを四角形化してDDSテクスチャをロードして貼っています.

https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/Samples/Desktop/D3D12HelloWorld/src/HelloTexture

今回のサンプル一式は,GitHubの下記にアップしました.

https://github.com/shaderjp/ShaderjpDirect3D12Samples/tree/master/D3D12DDSLoad

サンプルコード

今回コードをいじっているのは下記のソースです.

https://github.com/shaderjp/ShaderjpDirect3D12Samples/blob/master/D3D12DDSLoad/D3D12DDSLoad/D3D12HelloTexture.cpp

今回のサンプルでは,DirectXTexからDDSTextureLoader12.hとDDSTextureLoader12.cppを持ってきていますのでDDSTextureLoader12.hをインクルードしております.

キモとなっているのは,ソース内の292行目のあたりです.このブロックについては,下記にソースを掲載しておきます.

LoadDDSTextureFromFile関数を使うことでサンプルのテクスチャを読み込みます.

引数のstd::vector<D3D12_SUBRESOURCE_DATA> subresouceData;にDDSからのサブリソースデータの配列が入ります.今回は,サブリソースデータはミップマップの各レベルにあたります.

Direct3D12ではUpdateSubresourcesでテクスチャを更新するのですが,サブリソースの配列が渡せていればミップマップの構築も大丈夫です.

おわりに

DDSTextureLoader12.hとDDSTextureLoader12.cppの使用方法に関しては,実はあまりサンプルがなかったので書いてみました.

次回は,前回と今回を応用して直接OpenEXRをテクスチャとしてロードする方法について紹介します.