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。
我正在尝试创建一个使用流输出阶段的几何着色器,遵循 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。