D3DCOMPILER_xx.dllがない! シェーダのコンパイルについて

DirectX11プログラムでシェーダのコンパイルを行っているとexeファイルを起動時に”D3DCOMPILER_xx.dllがない”というエラーが発生して起動できません。VisualStudio2012のデバッガで実行した場合は起動できます。単純にdllをインストールすればいいといわけではなさそうなので調査してみる。


コンパイルをいつやるか

以前(DX9ぐらい?)は、実行時にコンパイルしていましたが、現在はビルド時に行うようです。たぶんGPUのシェーダ機能の仕様が統一され、コンパイル後のコード(機械語か中間コード?)を共用できるためだと思います。互換性の問題がなければ、事前にコンパイルしたほうが効率が良いはずです。コンパイルの処理時間、includeのファイル処理、バージョンやGPUによるコンパイル結果の違い(バグ)、ソースコード改変が困難など。

どこで、どうやって

実行前にシェーダをコンパイルし、バイナリデータ(csoファイル)を作成、実行時読み込み、シェーダ作成関数に渡すという流れになります。

fxc.exeを使う

HLSLシェーダーやエフェクトをコンパイルするためのオフラインツールです。SDKに含まれます。使い方は(エフェクト コンパイラ ツール/Microsoft)など

VisualStudioで

VS(2012から?)にシェーダをコンパイルする機能が追加されています。*.hlslや*.fxをプロジェクトに追加すると自動的にシェーダコンパイラの設定が行われます。エントリ関数名、シェーダモデル、種類、出力先などを必要に応じて設定します。出力指定した場所にcsoファイルが作成される。

D3DCOMPILER_xx.dll

シェーダコンパイラのライブラリですが、PCにインストールするものではなく、アプリケーションに同梱するdllファイルのようです。シェーダのコンパイラは新しければ良いというわけでなく、アプリ開発時のバージョンを使用することが望ましいため、この形式になったと思われます。xxはバージョンを表す2ケタの数字。
アプリ開発で使用するdllをexeファイルと同じ場所に配置する必要があります。

VisualStudio2012の場合

デバッガ経由で実行しているときは、”$(VCInstallDir)bin\D3DCOMPILER_46.dll”が読み込まれているため、このファイルをexeファイルのフォルダにコピー。

WindowsSDK

“$(WindowsSdkDir)Redist\D3D\x86″(x86は環境で変わる x64 arm)。
フォルダ名にredist(再配布)とあるのでアプリ公開時はこちらのほうが良いかも。


サンプルプログラム

シェーダコンパイルを実行時、ビルド時に行うサンプルプログラムです。
CompileBuild:ビルド時にコンパイルするプロジェクト
CompileRuntime:実行時にコンパイルするプロジェクト
ビルドするとapp/フォルダにexeを単独実行できるように必要なファイルをコピーします。
CompileBuildはapp/buildにexeとcsoファイル
CompileRuntimeはapp/runtimeにexeとD3DCOMPILER_xx.dllファイル
実行時とビルド時シェーダコンパイル

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.