環境:Visual Studio Community 2022
DirectX9でプログラマブルシェーダを使用するため、D3DXCreateEffectFromFile()にHLSLファイル(今回は拡張子fx)のパスを指定する必要があります。
単一のアプリの場合は、プロジェクトフォルダにfxファイルを置いた上で、D3DXCreateEffectFromFile()に"example.fx"のようにファイル名だけを指定すれば問題ありません。
しかし、このプログラマブルシェーダ使用部分をスタティックリンクライブラリ化した所、パスの指定をどうすべきかという問題が生じました。
状況:
・fxファイルのパスを指定するD3DXCreateEffectFromFile()をライブラリ内で使用する。
・fxファイルも同じライブラリの一部であり、C++のソースファイルと同じくライブラリのフォルダ内にある。
この場合、このファイルのパスを指定するには、どのようにするのが最適なのでしょうか?
普通によくある状況だろうと思いますが、皆さんはどのように設定されているのでしょうか。
検討した選択肢
(1) ファイル名だけを指定 → ✕
最初の状態です。アプリのプロジェクトは、そのプロジェクトのフォルダにfxファイルがあれば認識してくれますが、そこにない場合はD3DXCreateEffectFromFile()が失敗するため、何らかの対応が必要となりました。
(2) 絶対パスを指定 → △
ライブラリフォルダ内のfxファイルの絶対パスを指定する方法です。
とりあえずはこれで動きましたが、ライブラリのパスが変化すると破綻するので、暫定措置とみなしたい方法です。
また、書いているソースコードと同じ場所であるにも関わらず、それを指定するのにわざわざ絶対パスを使用している、という点も違和感があります。
(3) アプリからの相対パスを指定 → △
アプリフォルダからの相対パス(例えば「../../LIB/~」のような)を指定する方法です。
これでも動きましたが、当然ながら「ライブラリ内に特定アプリからの相対パスを書く」というのは論外です。
(4) 「ライブラリ ディレクトリ」を使用(したいが未達成)
Visual Studioがマクロ$(LibraryPath)として認識している「ライブラリ ディレクトリ」からの相対パスなら認識してくれるのでは?と期待したのですが、ダメでした。例えば$(LibraryPath)が表すパスにfxファイルを置いても認識してくれません。
ならば、C++内から$(LibraryPath)の値を取得できればfxファイルのパスを生成できそうですが、取得する方法が分かりませんでした。
もしそれが可能なのであれば、これが最適解になるのでしょうか?
(5) ライブラリプロジェクトへの追加 → ✕
ライブラリプロジェクト(これは常にアプリのソリューションに含めることにしています)の構成ファイルにしてあれば、"example.fx"というファイル名だけの指定でも認識してくれないかな?と期待したのですが、ダメでした。
(ちなみに、単に追加するだけだとコンパイルエラーになるので、試すにはfxファイルのプロパティで「ビルドから除外」を「はい」にする必要がありました。)
(6) fxファイルの内容をC++ファイル内に埋め込む → △
fxファイルを使うのをやめ、D3DXCreateEffectFromFile()ではなくD3DXCreateEffect()を使って、HLSLによる記述をC++ファイル内で文字列リテラルとして記述する方法です。
しかし、この方法はHLSL部分の編集がしづらくなります。ごく短いコードならともかく、ある程度の長さがある場合は、HLSLは外部ファイルにしておきたいです。
(7)ビルドイベントで何とかする → △
例えば、アプリのプロジェクトのビルドイベントに「fxファイルを自プロジェクトのフォルダにコピーする」のような処理を記述するという、強引なやり方です。
やりたくないですが、思いついたので一応…。