DirectXTexのテクスチャコンバータをOpenEXR対応にする手順のメモ

はじめに

MicrosoftがDirect3D11/12用にDDSファイルのコンバートや読み込み,保存などを行うライブラリDirectXTexはGitHubでソースが公開されています.
リポジトリ
https://github.com/Microsoft/DirectXTex
今回は,この中でDDSへのテクスチャコンバートを行うTexconvをHDRテクスチャフォーマットのOpenEXR対応にします.
Texconv
https://github.com/Microsoft/DirectXTex/tree/master/Texconv
Texconvのソース自体は,OpenEXRに対応しているのですが外部ライブラリに依存する関係でデフォルトではマクロでコードは機能しないようになっています.ビルドに関する手順に関しては下記に書かれていますが,この部分を解説していきます.
Adding OpenEXR
https://github.com/Microsoft/DirectXTex/wiki/Adding-OpenEXR

ビルドのための準備

まずは,DirectXTexのリポジトリからソースを取得します.これはGitで取得してもまるまるGitHubからダウンロードしてもどちらでもよいです.
リポジトリ
https://github.com/Microsoft/DirectXTex
今回は,VS 2017でビルドしようと思いますので,DirectXTex_Desktop_2017.slnを開きます.ソリューションの中のプロジェクトでtexconvのプロジェクトがあればOKです.

この状態でビルドするとOpenEXR対応にはならないのですが,依存するライブラリはVisual Studio上から取得するのでこのままにして次の手順に入ります.
 

依存する外部ライブラリのセットアップ

TexconvのOpenEXR対応で必要なライブラリは以下の2つです.

これらのライブラリを自分でビルドすればOpenEXR対応になりますが,結構ビルドが面倒なのでAdding OpenEXRに書かれているもう1つの手段NuGetからビルド済みパッケージを入手する方法にします.なお,これに関しては,”Building the OpenEXR auxiliary library”の”Using NuGet”のところに書かれています.
NuGet Galleryを検索していると,それぞれ下記にありました(Zlibはいろいろありますが,今回は下記にしました).

これをNuGetで取得しますのでVisual Studio 2017の【ツール】->【NuGet パッケージ マネージャー】->【パッケージ マネージャー コンソール】を起動します.

パッケージ マネージャー コンソールを開くと下記のような画面がありますが,赤丸で囲った【既定のプロジェクト】を【Tools\texconv】に変えます.

青線の個所のコンソールにNuGet Galleryの各ページに書かれているPackage Managerのコマンドを入力するとビルド済みのライブラリやヘッダーファイルがダウンロードされます.
ソリューションファイルのあるフォルダ階層にpackagesフォルダというのが出てきているのがわかると思います.

追加のヘッダーファイルとソースファイル

texconvのOpenEXR対応についてさらにヘッダーファイルとソースの追加を行う必要があります.追加するヘッダーファイルとソースは下記です.

これはそのままプロジェクトに追加すればOKです.

ソースの変更

ソースを追加したら既存のコードの変更も一部あります.変更はtexconv.cppになります.
https://github.com/Microsoft/DirectXTex/blob/master/Texconv/texconv.cpp
42行目の#define USE_OPENEXRがデフォルトではコメントアウトされていますが,このコメントアウトを外しUSE_OPENEXRを有効にします.

//Uncomment to add support for OpenEXR (.exr)
//#define USE_OPENEXR
#ifdef USE_OPENEXR
// See <https://github.com/Microsoft/DirectXTex/wiki/Adding-OpenEXR> for details
#include “DirectXTexEXR.h”
#endif

これで必要な準備が終わりましたので,ビルドしてみます.

実行

ビルドが成功したら起動してみます.
filetypeのオプションにEXRが追加されていればビルド成功です.

試しにBC6Hや非圧縮16bit float変換などをやってみる場合は下記で行けると思います(-rオプションはワイルドカードが使えます.).
BC6H 符号なし
.\texconv.exe -r -f BC6H_UF16 *.exr
非圧縮16bit float
.\texconv.exe -r -f R16G16B16A16_FLOAT *.exr
※BC6Hは解像度のピクセルが4の倍数である必要があります.

おわりに

とりあえず、自分用のメモではあるのですが,NuGetでパッケージを取得することでかなりお手軽にビルドできるので知っておくと便利ですね.
OpenEXRはPhotoshopでも今は標準で扱えますし,HDRモニタなど出てきてHDRフォーマットのテクスチャの重要性も高くなりそうですね.