1

我正在尝试使用位于此处的 Dxc 编译器运行 DirectX 12 应用程序。着色器源编译成功,但 D3D api 无法读取着色器字节码。

我正在使用 D3DCompiler DXC 桥。根据文档,我需要将其重命名为 d3dcompiler_47.dll 并将 dxcompiler.dll 和 dxil.dll 放在可执行文件旁边,以便进行正确的验证和签名。我在实验模式下运行,所以签名应该无关紧要。我还在运行应该支持 dxil 的 Windows 版本 1703。

当应用程序运行时,我可以看到 d3dcompiler_47、dxcompiler 和 dxil 都被加载到内存中,因此 D3D 运行时似乎无法将 DXIR 识别为有效的字节码格式。停!

4

2 回答 2

1

您的视频驱动程序是否支持 Shader Model 6,更具体地说是您尝试使用的任何 Shader Model?

检测有点棘手,但试试这个:

D3D12_FEATURE_DATA_SHADER_MODEL shaderModel = {};

#if defined(NTDDI_WIN10_VB) && (NTDDI_VERSION >= NTDDI_WIN10_VB)
shaderModel.HighestShaderModel = D3D_SHADER_MODEL_6_6;
#elif 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 开发人员命令提示符的一部分提供。

您也可以尝试最新的DxCapsViewer

于 2019-05-03T19:46:25.467 回答
1

为了让它工作,我实际上需要 Windows 10 Creators Update SDK (1809)。我还需要通过D3D12EnableExperimentalFeatures. 我在Wave Intrinsics 的 DirectX 12 示例中找到了这个。我最初认为启用实验模式是使用着色器模型 6+ 功能特别需要的,但也许它也需要解释 DXIL/DXIR。

我想编译DXC需要 Windows 10 (1703)。运行使用编译的着色器DXC需要 Windows 10 (1809) 以及任何硬件供应商驱动程序支持。但是,我不确定这是绝对正确的。

于 2019-05-10T18:05:16.383 回答