DirectX11 - поток вывода геометрического шейдера не определен - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать геометрический шейдер, который использует стадию вывода потока, следуя схеме, предоставленной в MSDN: Ссылка

Однако при попытке сделать это я получаю следующую ошибку:

ID3D11Device::CreateGeometryShaderWithStreamOutput: Stream (=3435973836) must be less than or equal to 3.

Насколько я знаю, единственная точка, в которой я могу определить поток, находится в записи объявления выходного потока, но я уже сделал это (код ниже).

// Reads compiled shader into a buffer
HRESULT result = D3DReadFileToBlob(filename, &geometryShaderBuffer);

D3D11_SO_DECLARATION_ENTRY SODeclarationEntry[3] =
{

    { 0, "POSITION", 0, 0, 3, 0 },
    { 0, "NORMAL", 0, 0, 3, 0 },
    { 0, "TEXCOORD", 0, 0, 3, 0 }

};

// Create the geometry shader from the buffer & SO declaration
result = renderer->CreateGeometryShaderWithStreamOutput(geometryShaderBuffer->GetBufferPointer(), geometryShaderBuffer->GetBufferSize(), SODeclarationEntry, sizeof(SODeclarationEntry),
        NULL, 0, 0, NULL, &streamOutputGeometryShader);

Где-то еще, где я должен определять выходной поток?

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема в том, что вы предоставили слишком большое число для NumEntries, поэтому он читает кучу ненужных записей после 3, которые вы определили для pSODeclaration.Вот почему выходные данные отладки ошибки проверки сообщают о бессмысленных значениях, таких как «Поток (= 3435973836)».

result = renderer->CreateGeometryShaderWithStreamOutput(
    geometryShaderBuffer->GetBufferPointer(), geometryShaderBuffer->GetBufferSize(),
    SODeclarationEntry, sizeof(SODeclarationEntry),
    nullptr, 0, 0, nullptr, &streamOutputGeometryShader);

должно быть:

result = renderer->CreateGeometryShaderWithStreamOutput(
    geometryShaderBuffer->GetBufferPointer(), geometryShaderBuffer->GetBufferSize(),
    SODeclarationEntry, _countof(SODeclarationEntry),
    nullptr, 0, 0, nullptr, &streamOutputGeometryShader);

Обратите внимание, что если вы работаете с другимКомпилятор, чем Microsoft Visual C ++, _countof это:

#define _countof(array) (sizeof(array) / sizeof(array[0]))

Кстати, это та ошибка, которую статический анализ кода (/analyze) и аннотации SAL, которые используются для системных заголовков Windows, могутнайти для вас:

warning C6385: Reading invalid data from 'SODeclarationEntry':  the readable
size is '48' bytes, but '768' bytes may be read.

См. Документы Microsoft для получения дополнительной информации.

...