我正在尝试创建一个几何着色器,它使用遵循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);
我应该在其他地方定义输出流吗?
答案 0 :(得分:2)
这里的问题是您为NumEntries
提供了一个太大的数字,因此它在为pSODeclaration
定义的3个条目之后读取了一堆垃圾条目。这就是为什么验证错误调试输出会报告诸如“流(= 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注释可以为您找到的错误:
warning C6385: Reading invalid data from 'SODeclarationEntry': the readable
size is '48' bytes, but '768' bytes may be read.
有关更多信息,请参见Microsoft Docs。