运行 DXIL 中的着色器

Running Shaders in DXIL

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

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

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

您的视频驱动程序是否支持 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,但如果我直接从供应商网站下载它们,它们就支持它。

If you have the Windows 10 SDK (17134) or later, then you have a build of the DXC compiler already available as part of the Visual Studio 2017 or 2019 Developer Command Prompt.

You can also try the latest DxCapsViewer.

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

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