DirectX11 - 几何着色器流输出流未定义

DirectX11 - Geometry Shader Stream Output Stream Undefined

我正在尝试创建一个使用流输出阶段的几何着色器,遵循 MSDN 上提供的大纲:Link

然而,当我尝试这样做时,出现以下错误:

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);

我应该在其他地方定义输出流吗?

这里的问题是您为 NumEntries 提供的数字太大,因此它会读取您为 pSODeclaration 定义的 3 之后的一堆垃圾条目。这就是验证错误调试输出报告无意义值的原因,例如 "Stream (=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) 和用于 Windows 系统的 SAL 注释 headers 可以为您找到的那种错误:

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

有关详细信息,请参阅 Microsoft Docs