WedX - журнал о программировании и компьютерных науках

В: Ошибка DX12 при создании состояния графического конвейера.

Следуя документации Microsoft и создавая PSO, я получаю следующие ошибки D3D12.

Код ошибки

Учитывая, что первая ошибка гласит, что размер закодированной подписи не соответствует указанному размеру. Я сравнил шейдер и подпись.

    D3D12_INPUT_ELEMENT_DESC inputElementDesc[] =
    {{
      "POSITION",
      0,
      DXGI_FORMAT_R32G32B32_FLOAT,
      0,
      0,
      D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA,
      0
    }};

    D3D12_INPUT_LAYOUT_DESC inputLayoutDesc;
    inputLayoutDesc.pInputElementDescs = inputElementDesc;
    inputLayoutDesc.NumElements = ARRAYSIZE(inputElementDesc);
struct VSIn 
{
    float3 pos : POSITION;
};

struct VSOut
{
    float4 pos : SV_POSITION;
};

VSOut vs_main( VSIn input, uint index : SV_VertexID )
{
    VSOut output = (VSOut)0;
    output.pos = float4(input.pos, 1.0f);
    return output;
}

Я не могу найти никаких нарушений. Поэтому я подумал, что, возможно, проблема заключается в том, как я компилировал свои шейдеры. Для этой цели я использовал библиотеку IDxcCompiler. При отладке я не получил никаких ошибок при компиляции.

    ComPtr<IDxcOperationResult> result = nullptr;
    ComPtr<IDxcBlobEncoding> vertexBlob = nullptr;
    std::vector<LPCWSTR> compileArguments;
    compileArguments.push_back(L"/Gis");
    ThrowIfFailed(library->CreateBlobFromFile(L"VertexShader.hlsl", nullptr, &vertexBlob));
    ThrowIfFailed(compiler->Compile(
        vertexBlob.Get(),
        L"VertexShader.hlsl",
        L"vs_main",
        L"vs_6_4",
        compileArguments.data(),
        (UINT)compileArguments.size(),
        NULL,
        NULL,
        NULL,
        &result
    ));

И капли, кажется, получили свою информацию

D3D12_GRAPHICS_PIPELINE_STATE_DESC gPipelineStateDesc;
gPipelineStateDesc.pRootSignature = this->gRootSignature.Get();
gPipelineStateDesc.InputLayout = inputLayoutDesc;
gPipelineStateDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE;

ComPtr<IDxcBlobEncoding> test16;
gPipelineStateDesc.VS.pShaderBytecode = reinterpret_cast<void*>(vertexBlob->GetBufferPointer());
library->GetBlobAsUtf16(vertexBlob.Get(), &test16);
OutputDebugStringW(reinterpret_cast<LPCWSTR>(test16->GetBufferPointer()));
gPipelineStateDesc.VS.BytecodeLength = vertexBlob->GetBufferSize();

gPipelineStateDesc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM;
gPipelineStateDesc.NumRenderTargets = 1;
gPipelineStateDesc.SampleDesc.Count = 1;
gPipelineStateDesc.SampleMask = UINT_MAX;

gPipelineStateDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID;
gPipelineStateDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;

D3D12_RENDER_TARGET_BLEND_DESC RTBlendDesc = {
    false,
    false,
    D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
    D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
    D3D12_LOGIC_OP_NOOP, D3D12_COLOR_WRITE_ENABLE_ALL
};
for (UINT i = 0; i < D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i)
{
    gPipelineStateDesc.BlendState.RenderTarget[i] = RTBlendDesc;
}
ThrowIfFailed(this->gDevice->CreateGraphicsPipelineState(&gPipelineStateDesc, IID_PPV_ARGS(&this->gPipelineState)));

Вывод результатов

С размером буфера/длиной байтового кода 241 байт. Кто-нибудь знает, что пошло не так?

29.10.2020

  • Некоторые из этих предупреждений связаны с тем, как вы настраиваете gPipelineStateDesc. Кроме того, вы не устанавливаете gPipelineStateDesc.VS.BytecodeLength, что необходимо. Наконец, похоже, вы на самом деле не используете результат компиляции, а просто передаете исходный код HLSL в PSO, что не сработает. 31.10.2020
  • Обратите внимание, что вы можете ознакомиться с набором инструментов DirectX для DX12. 31.10.2020
  • Я случайно удалил длину байт-кода из поста при очистке ненужного отладочного кода. Поскольку предупреждения связаны с настройкой, я добавил еще немного кода, где я настроил описание. Исключение возникает во время функции создания. Поищу набор инструментов, спасибо! 02.11.2020
  • Да, это было @ChuckWalbourn! Большой двоичный объект шейдера содержал только код HLSL, а не результат компиляции. Я отредактирую пост с решением. Большое спасибо! 04.11.2020

Ответы:


1

Чак Уолборн помог мне найти решение. Большой двоичный объект не получил результатов компиляции, аналогичной D3DCompileFromFile(). Используя IDxcOperationResult в последнем параметре компилятора. Вы получаете результаты от компилятора следующим образом:

    ComPtr<IDxcOperationResult> result = nullptr;
    ....
    ...
    ..
    ComPtr<IDxcBlob> vertexShader = nullptr;
    result->GetResult(vertexShader);

Таким образом, ->GetBufferPointer() должен работать правильно. Остальные ошибки произошли из-за того, что забыли инициализировать описание состояния конвейера с помощью ={};.

04.11.2020
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]