DDSファイルを読み込もう!
DDSファイルとは、DirectXで使用できる圧縮テクスチャファイルです。
ゲームのモデルに色や模様をつけるためにPNGやJPEG、TRGなどの画像フォーマットを扱います。
画像のフォーマットを表でまとめてみました。
フォーマット | 圧縮タイプ | 特徴 |
---|---|---|
.bmp | 無圧縮 | 綺麗/データ大きい |
.tiff | 無圧縮 | 綺麗/データ大きい |
.tga | 無圧縮/可逆圧縮 | 綺麗/データ大きい/解凍早い |
.png | 可逆圧縮 | 綺麗/データ小さい/解凍遅い |
.jpg | 非可逆圧縮 | 汚い/データすごく小さい/解凍遅い |
.dds | 非可逆圧縮 | 綺麗~汚い/データ大~小/解凍なし |
各フォーマットにはメリットデメリットがあります。
それぞれの利点を生かせるように、対応したファイルがあれば読み込めるようにします
C++17以上の実装になります。
実装にはソリューションエクスプローラーのプロパティページからC++17にしましょう。
DirectXTexのライブラリが必要です。
- わかりやすいサイト
メリット
ファイルを読み込むときのメモリを削減できる
描画パフォーマンスの向上
読み込み、展開処理の高速化
DDSファイルの作り方
2020年3月22日にNVIDEAがDDS変換ツールをリリースしました。
このツールを使って他の画像形式からDDSファイルに変換できます。
他にはキューブマップや法線マップなどを作ることが出来ます。
- ダウンロード先
準備
- Githubからライブラリをとってきます。
ソリューションと同じディレクトリにこのファイルがあるとします。
ファイルの中にある、自分が実装したいプラットフォームのDirectXTKのソリューションを開いてビルドします。
Binのファイルが作られて、対応したプラットフォームのライブラリが作られます。
DirectXTexのライブラリの読み込みに使います。
-
DDSTextureLoader.hを読み込めるようにします。
ソリューションエクスプローラーのプロパティページ>C/C++>全般>追加のインクルードディレクトリ
.\DirectXTK-main\Inc
.\DirectXTK-main\Src -
DirectXTexのライブラリを読み込みます
ソリューションエクスプローラーのプロパティページ>リンカー>全般>追加のライブラリディレクトリ
.\DirectXTK-main\Bin\Desktop_2019\x64\Debug
Desktop_2019以降は各プラットフォームに合わせてください
ソリューションエクスプローラーのプロパティページ>リンカー>入力>追加の依存ファイル
DirectXTK.lib
実装
#include <filesystem>
#include <WICTextureLoader.h>
#include <DDSTextureLoader.h>
#include "TextureLoader.h"
std::filesystem::path dds_filename(filename);
dds_filename.replace_extension("dds");
if (std::filesystem::exists(dds_filename.c_str()))
{
HRESULT hr = DirectX::CreateDDSTextureFromFile(device, dds_filename.c_str(),
resource.GetAddressOf(), shader_resource_view.GetAddressOf());
}
else
{
HRESULT hr = DirectX::CreateWICTextureFromFile(device, wfilename, resource.GetAddressOf(), shader_resource_view.GetAddressOf());
}
#include <wrl.h>
#include <d3d11.h>
#include <DirectXMath.h>
Microsoft::WRL::ComPtr<ID3D11Device> device;
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> shader_resource_view;
Microsoft::WRL::ComPtr<ID3D11Resource> resource;
変数説明
const char* filename:テクスチャを読み見込む時のファイルパスです。
wchar_t* wfilename:ワイド文字に変換したファイルパスです。
コード説明
dds_filenameという変数でDDS用のファイルパスを作ります。
ファイルフォーマットでddsがつくファイルを探して、該当すれば読み込みます。
読み込まなかったらWICで読み込むかダミーテクスチャを作りましょう。
あとは、関数の引数通りに設定していきます。
おわり
最近DirectXTKのファイル名がDirectXTK-masterから、DirectXTK-mainに変わりました。