Visual Studio 2019 Version 16.7以降でディレクトリ生成を伴うシェーダコンパイルに失敗する


8月頃にリリースされた16.7.1から、現在リリースされている16.7.5まで確認済み。
そう、二か月以上Visual Studio 2019でシェーダがコンパイルできない致命的な状態なのである。

再現手順はとても簡単で、DirectX-Graphics-SamplesのVS2019に対応した適当なリビジョン(タグ10.0.19041.0以降あたり)を取得してきて、VS2019でModelViewerをビルドするだけ。シェーダコンパイル時に大体次のような意味不明なエラーを吐く。プロファイルによってはfxcである場合もある。

dxc failed : error code 0x80070459.

詳細な条件は次の通り。

  • hlslファイルをソリューションエクスプローラーに設定して、本来なら正常にコンパイルできる設定にしてある
  • 「ヘッダー ファイル名」または 「オブジェクトファイル名」にディレクトリ生成を伴うパスを指定している
    • 例えば、CompiledShaders\%(Filename).h や $(OutDir)CompiledShaders\%(Filename).cso は該当する
    • 一方、 $(OutDir)%(Filename).cso  はディレクトリを生成しないので該当しない

この原因は以下に報告されている。

Typo in FXC Target in VS 16.7.1 (Developer Community)

要するに、「 FxcOutputs 」と記述されるべき設定が「 _FxcOutputs 」とタイポされているというあまりにもお粗末で下らないバグだ。

幸いにも、プログラムによるバグではなく、設定ファイルによるバグであるため、手元で修正することが出来る。
Visual Studio 2019のインストール場所を変更していない場合、次のファイルをテキストエディタ開く。Community以外の場合も適宜読み替えてほしい。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\
Microsoft.CppBuild.targets

「 _FxcOutputs 」で検索すると一か所該当する箇所があるので、これを「 FxcOutputs 」に変更し保存する。ただし、管理者権限が必要である。

重複した別の報告(HLSL Shader Compiler fails to create output directory for header files)のリプライによると、Preview版では修正されたようだが、こんな致命的で馬鹿げたバグは即座にhotfixがリリースされるべきだろう。

コメントを残す

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