我正在尝试使用位于here的Dxc编译器运行DirectX 12应用程序。着色器源编译成功,但是D3D api无法读取着色器字节码。
我正在使用D3DCompiler DXC桥。根据文档,我需要将其重命名为d3dcompiler_47.dll并将dxcompiler.dll和dxil.dll放在可执行文件旁边,以进行正确的验证和签名。我正在实验模式下运行,因此签名无关紧要。我还在运行应该支持dxil的Windows版本1703。
当应用程序运行时,我可以看到d3dcompiler_47,dxcompiler和dxil都已加载到内存中,因此D3D运行时似乎无法将DXIR识别为有效的字节码格式。小心!
答案 0 :(得分:0)
您的视频驱动程序是否支持Shader Model 6,并且更具体地支持您要使用的任何Shader Model?
检测有点棘手,但是请尝试以下操作:
D3D12_FEATURE_DATA_SHADER_MODEL shaderModel = {};
#if defined(NTDDI_WIN10_19H1) && (NTDDI_VERSION >= NTDDI_WIN10_19H1)
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_5;
#elif defined(NTDDI_WIN10_RS5) && (NTDDI_VERSION >= NTDDI_WIN10_RS5)
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_4;
#elif defined(NTDDI_WIN10_RS4) && (NTDDI_VERSION >= NTDDI_WIN10_RS4)
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_2;
#else
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_0;
#endif
HRESULT hr = device->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &shaderModel, sizeof(shaderModel));
while (hr == E_INVALIDARG && shaderModel.HighestShaderModel > D3D_SHADER_MODEL_6_0)
{
shaderModel.HighestShaderModel = static_cast<D3D_SHADER_MODEL>(static_cast<int>(shaderModel.HighestShaderModel) - 1);
hr = device->CheckFeatureSupport(D3D12_FEATURE_SHADER_MODEL, &shaderModel, sizeof(shaderModel));
}
if (FAILED(hr))
{
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_5_1;
}
例如,我注意到在我的系统上,Windows Update提供的驱动程序不支持Shader Model 6,但是如果我直接从供应商网站下载了这些驱动程序,则它们确实支持它。
如果您具有Windows 10 SDK(17134)或更高版本,那么您已经拥有
DXC
编译器的构建,可作为Visual Studio 2017或2019 Developer Command Prompt的一部分提供。
答案 1 :(得分:0)
为了使其正常工作,我实际上需要Windows 10 Creators Update SDK(1809)。我还需要通过D3D12EnableExperimentalFeatures
明确启用实验模式。我在DirectX 12 sample for Wave Intrinsics上找到了它。最初,我认为启用实验模式是使用Shader Model 6+功能特别需要的,但也许还需要解释DXIL / DXIR。
我想使用DXC
进行编译需要Windows 10(1703)。运行使用DXC
编译的着色器需要Windows 10(1809)以及所有硬件供应商的驱动程序支持。但是,我不确定那是绝对正确的。