在DXIL中运行着色器

时间:2019-05-02 18:29:01

标签: shader hlsl directx-12

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

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

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

2 个答案:

答案 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)以及所有硬件供应商的驱动程序支持。但是,我不确定那是绝对正确的。