Запуск шейдеров в DXIL - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь запустить приложение DirectX 12 с помощью компилятора Dxc, расположенного здесь .Исходный код шейдера успешно компилируется, однако API-интерфейсу D3D не удается прочитать байт-код шейдера.

Я использую D3DC Compiler DXC Bridge.В соответствии с документами мне нужно переименовать его в d3dcompiler_47.dll и поместить dxcompiler.dll и dxil.dll рядом с исполняемым файлом для правильной проверки и подписывания, которое я сделал.Я бегу в экспериментальном режиме, поэтому подписание не должно иметь значения.Я также использую версию Windows 1703, которая должна поддерживать dxil.

Когда приложение запускается, я вижу, что d3dcompiler_47, dxcompiler и dxil все загружаются в память, так что кажется, что среда выполнения D3Dне может распознать DXIR в качестве допустимого формата байтового кода.HALP!

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Для того, чтобы это работало, мне действительно требовался SDK Windows 10 Creators Update (1809).Мне также нужно было явно включить экспериментальный режим через D3D12EnableExperimentalFeatures.Я обнаружил это на образце DirectX 12 для Wave Intrinsics .Сначала я думал, что включение экспериментального режима было особенно необходимо для использования функций шейдерной модели 6+, но, возможно, он также необходим для интерпретации DXIL / DXIR.

Я полагаю, что для компиляции с DXC требуется Windows 10 (1703).Для запуска шейдеров, скомпилированных с DXC, требуется Windows 10 (1809), а также поддержка драйверов любого производителя оборудования.Однако я не уверен, что это абсолютно правильно.

0 голосов
/ 03 мая 2019

Поддерживает ли ваш видеодрайвер Shader Model 6 и, более конкретно, какую модель Shader вы пытаетесь использовать?

Обнаружение немного сложнее, но попробуйте это:

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, не поддерживают Shader Model 6, но если я загружал их непосредственно с веб-сайта поставщика, они поддерживали его.

Если у вас установлен Windows 10 SDK (17134) или более поздней версии, у вас уже есть сборка компилятора DXC, уже доступная в составе командной строки для разработчиков Visual Studio 2017 или 2019.

...