今回は、WIC[Windows Imaging Component]を使って描画しようと思いましたが、その前に、
DDS[DirectDraw Surface](.dds)という画像データを用いて描画していきたいと思います。
初めに
まずは、DDSとは何なのかということを説明したいと思います。
というのもWikipediaに書いてありましたので抜粋します。
DirectDraw Surface (.dds) はマイクロソフトによって開発された、テクスチャやキューブ (環境) マップを格納するために利用されるファイルフォーマットであり、圧縮形式と非圧縮形式の両方に対応している。これは、Microsoft DirectX対応のGPUのほか、プレイステーション3やXboxのような家庭用ゲーム機で利用されるDXTC (S3TC) 圧縮データを格納できるように作られている。
引用元: https://ja.wikipedia.org/wiki/DirectDraw_Surface
つまりは、DirectX用のファイルフォーマットということですね。
実は、このDDSフォーマット、非可逆圧縮なのでBMPやPNGよりも多少品質は落ちますが、非常に大きな利点が1つあります。
それは、グラフィックカードのメモリを節約できるということ。
使用するメモリ量は、BMPやPNGに比べて約 1/4~1/8 になるそうです。
なぜこれが実現できるのかというと、DirectXがDDSフォーマットのテクスチャを圧縮されたままの状態で処理できるためだということです。
では、さっそく実践してみましょう!!
プロジェクトの作成
前回同様にプロジェクトを新しく作成します。
プロジェクト名は、” 0003-3_Texture_DDS “としておきましょう。
ソースコード
以下がソースです。これも前回同様、流れが分かりやすいようにmain.cppだけでまとめました。
以下のソースをコピペするか、ダウンロードしてVisual Studio の「ソースファイル」に保存してください。
コピペするなら、
「ソースファイル」で右クリックして
「追加」→「新しい項目」で、「C++ ファイル」を選び、名前を” main.cpp “にして追加ボタンを押して作成してください。
ダウンロードなら、
同じく「ソースファイル」で右クリックして
「追加」→「既存の項目」で、main.cppを選択して追加してください。
今回は、前回のビットマップテクスチャとは違い、
頂点データを4つにしてプリミティブトポロジの設定を
「D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP」
にすることで4つでも描画できています。
これでアルファ値を制御するときも斜め線が入るのを防ぐことができますし、
単純にこちらの方が処理的に簡単なのもあるので四角形のジオメトリ定義をするときは基本こっちでやる感じです。
そして、d3dx12.hも前回同様インクルードしますので、
以下のヘッダファイルをダウンロードしてプロジェクトの「ヘッダー ファイル」に「既存の項目」から追加してください。
また、main.cpp内で「texture.dss」を読み込んでいる” LoadDDSTextureFromFile “という関数がありますが、
これは「DirectXTex」というライブラリから持ってきた” DDSTextureLoader12 “を配置してインクルードすることによって呼び出せるものです。
ちなみに、このDirectXTexはMicrosoft公式のGithubからダウンロードできます。
リンク: https://github.com/microsoft/DirectXTex
しかし、この最新のコードだと私にとっては使いづらかったので、いくらかリビジョンが古いコードを用います。
以下のソースをダウンロードしてmain.cppと同じディレクトリ下に配置してください。
DDSTextureLoader12.h
DDSTextureLoader12.cpp
次に、シェーダファイルを読み込みます。
これは「ソース ファイル」から「追加」→「新しい項目」で、
「Visual C++」→「HLSL」の中で.hlslなら何でもいいのですが(Visual Studio側が勝手にテンプレートを作るだけなので)、
ここでは「ジオメトリ シェーダー ファイル (.hlsl)」を選んで、
名前を” shaders.hlsl “にして追加ボタンを押してください。
すると、「ソース ファイル」中にshaders.hlslが作れますので、
中にあるコードを全て以下のコードでコピペして上書きするか、
ダウンロードして「既存の項目」で追加しましょう。
このコードは、” DirectX12 | 3-2. ビットマップテクスチャ “と同じ” shaders.hlsl “です。
shaders.hlsl
ただ、これだけではビルドしても動きません。
あと、shaders.hlsl自体にもプロパティ設定をする必要があります。
カーソルを「ソリューション エクスプローラー」内にある「shaders.hlsl」にかざして右クリックし、
「プロパティ」を選んで、プロパティダイアログを開きます。
「構成プロパティ」→「全般」の中の「項目の種類」という項目で「HLSLコンパイラ」から「カスタム ビルド ツール」に変更します。
そのまま適用ボタンを押し、切り替えて、
「カスタム ビルド ツール」の中の「コマンド ライン」と「出力ファイル」の項目にそれぞれ、
copy %(Identity) "$(OutDir)" > NUL
$(OutDir)\%(Identity)
を入力します。
これでexeと同じディレクトリ下にshaders.hlslがコピーされます。
これでOKを押します。
次に、main.cppでDDSテクスチャを読み込んでいますので、以下のdds画像データをダウンロードしてmain.cppと同じディレクトリに入れておきましょう。
texture.dss
以上で作成は完了です!!
以下のようになっていればOK。
ツールバーの「デバッグ」から「デバッグの開始(F5)」で実行できます。
ビルドするときは、「0003-3_Texture_DDS」を右クリックして「スタートアップ プロジェクトに設定」を押してプロジェクトターゲットを変更してからするようにしてください。
画面にDDSテクスチャが画面全体表示できていたら終わりです。お疲れさまでした。
最後に
学習を進めていく中でバージョンアップによる差分をすぐに確認できるように「WinMerge」というソフトを導入した方がすぐにでもプログラムを理解できるようになるかと思います。
この作例では、記事「DirectX12 | 3-2. ビットマップテクスチャ」でのmain.cppと今回のmain.cppとで差分を確認して学習に活かしてください。
何のコードが変更されたり追加されたのかがすぐに分かります。
まとめ
WICでJPGやPNGを描画させる前に取り敢えずDDSを描画させてみようということでやってみました。
DDSは処理を軽くするために使われるらしいので覚えておいても損はありません。
では、次はWICを使うことによってBMP, JPG, PNG, TIFF, GIFを描画できるプログラムを作成したいと思います。