如何让 Visual Studio 2017 / msbuild 使用最新的 DirectX 着色器编译器?

How do I get Visual Studio 2017 / msbuild to use the latest DirectX shader compiler?

我正在尝试编译使用 HLSL 着色器的 a C# game project。这些着色器是 .csproj 项目的一部分,因此 Visual Studio 应该将它们与代码一起编译。着色器属性应该是正确的 - 着色器类型正确,着色器使用足够新的着色器模型 (5.1) 等。尽管如此,Visual Studio 不会构建所有着色器,而是输出两个无用的错误:

error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Invalid operand type for operand #2 of opcode #107 (counts are 1-based).
error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Can't continue validation - aborting.

我的第一个猜测是着色器一定在某些方面有问题。我打开 VS2017 命令提示符,如预期的那样,手动 运行 fxc 对某些像素着色器产生了相同的错误。但是,我随后决定检查是否安装了其他版本的 fxc

C:\koodia\OpenSAGE\src\OpenSage.DataViewer.Windows\Shaders>where fxc
C:\Program Files (x86)\Windows Kits\bin\x86\fxc.exe
C:\Program Files (x86)\Windows Kits\bin.0.15063.0\x86\fxc.exe

后一个来自更新的 Windows SDK - fxc /? 报告版本为 Direct3D Shader Compiler 10.1,而第一个是 Direct3D Shader Compiler 10.0.10011.16384。我使用 Powershell 脚本验证了所有着色器都可以使用较新的编译器成功编译。然后我使用 msbuild 从命令行编译项目,确认 msbuild(因此 Visual Studio)正在调用旧的 fxc:

FxCompile:
  C:\Program Files (x86)\Windows Kits\bin\x86\Fxc.exe /nologo /Emain /T ps_5_1 /Fo obj\Debug\Shaders\MeshPS.cso /Zi /enable_unbounded_descriptor_tables Shade
  rs\MeshPS.hlsl
error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Invalid operand type for operand #2 of opcode #107 (counts are 1-based). [C:\koodia\OpenSAGE\src
\OpenSage.DataViewer.Windows\OpenZH.DataViewer.Windows.csproj]
error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Can't continue validation - aborting. [C:\koodia\OpenSAGE\src\OpenSage.DataViewer.Windows\OpenZH
.DataViewer.Windows.csproj]

最后,问题本身:如何确保 msbuild 使用最新安装的 Windows SDK 中的着色器编译器?

我已经安装了最新的 Windows SDK、最新的 Windows 更新并且我已经升级到 Visual Studio 15.3.5,但没有任何效果。我在网上找不到与此问题直接相关的任何内容。 Visual Studio 似乎没有任何与 Windows SDK 或 DirectX 版本相关的设置。

我设法用一个愚蠢的技巧暂时解决了这个问题。我将 C:\Program Files (x86)\Windows Kits.1\bin\x86 中的 fxc.exed3dcompiler_47.dll 替换为 C:\Program Files (x86)\Windows Kits\bin.0.15063.0\x86 中的 fxc.exed3dcompiler_47.dll(并备份了原件)。

手动修改 Windows SDK 很少是个好主意,但在我的用例中,它可能不会破坏任何东西,因为 FXC 应该向后兼容。

我仍在寻找更好的解决方案,或者至少确认我的 Windows + VS 安装是否有问题,或者这是否是 msbuild 中的实际错误/缺失功能。