为什么调用 glMultiDrawElementsIndirect 时会出现错误 INVALID_OPERATION
Why do I get error INVALID_OPERATION when I call glMultiDrawElementsIndirect
我目前正尝试在 Java 中将 glMultiDrawElementsIndirect
与 LWJGL 一起使用,但出现错误 INVALID_OPERATION。
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, this.modelManager.indirect, NB_TYPE_MESH, 0);
我在文档中看到此错误与 GL_DRAW_INDIRECT_BUFFER
或 GL_ELEMENT_ARRAY_BUFFER
有关,但我不知道问题出在我的代码中。
间接缓冲区
int[] indirect = new int[NB_TYPE_MESH*5];
for(int i=0; i<2; i++) {
indirect[i] = getElementCount().get(i);
indirect[1+i] = Game.NB_MAX_OBJECTS/2;
indirect[2+i] = 0;
indirect[3+i] = i==0?0:getElementCount().get(i-1);
indirect[4+i] = i; // maybe 0
}
vboIdIndirect = glGenBuffers();
IntBuffer gIndirectBuffer = MemoryUtil.memAllocInt(indirect.length);
gIndirectBuffer.put(indirect).flip();
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, vboIdIndirect);
glBufferData(GL_DRAW_INDIRECT_BUFFER, gIndirectBuffer, GL_DYNAMIC_DRAW);
我的元素缓冲区
vboId = glGenBuffers();
vboIdList.add(vboId);
indicesBuffer = MemoryUtil.memAllocInt(indices.length);
indicesBuffer.put(indices).flip();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_DYNAMIC_DRAW);
indices 包含 NB_TYPE_MESH
类型网格的索引
如果在调用 glMultiDrawElementsIndirect
时将缓冲区绑定到目标 GL_DRAW_INDIRECT_BUFFER
,则 indirect 参数被解释为基本机器单位中的偏移量这个缓冲区。
因此您需要在绘制元素之前绑定 GL_DRAW_INDIRECT_BUFFER
,但是 indirect 参数必须是 null
:
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, this.modelManager.indirect, NB_TYPE_MESH, 0);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, vboIdIndirect);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, null, NB_TYPE_MESH, 0);
我目前正尝试在 Java 中将 glMultiDrawElementsIndirect
与 LWJGL 一起使用,但出现错误 INVALID_OPERATION。
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, this.modelManager.indirect, NB_TYPE_MESH, 0);
我在文档中看到此错误与 GL_DRAW_INDIRECT_BUFFER
或 GL_ELEMENT_ARRAY_BUFFER
有关,但我不知道问题出在我的代码中。
间接缓冲区
int[] indirect = new int[NB_TYPE_MESH*5];
for(int i=0; i<2; i++) {
indirect[i] = getElementCount().get(i);
indirect[1+i] = Game.NB_MAX_OBJECTS/2;
indirect[2+i] = 0;
indirect[3+i] = i==0?0:getElementCount().get(i-1);
indirect[4+i] = i; // maybe 0
}
vboIdIndirect = glGenBuffers();
IntBuffer gIndirectBuffer = MemoryUtil.memAllocInt(indirect.length);
gIndirectBuffer.put(indirect).flip();
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, vboIdIndirect);
glBufferData(GL_DRAW_INDIRECT_BUFFER, gIndirectBuffer, GL_DYNAMIC_DRAW);
我的元素缓冲区
vboId = glGenBuffers();
vboIdList.add(vboId);
indicesBuffer = MemoryUtil.memAllocInt(indices.length);
indicesBuffer.put(indices).flip();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, GL_DYNAMIC_DRAW);
indices 包含 NB_TYPE_MESH
类型网格的索引
如果在调用 glMultiDrawElementsIndirect
时将缓冲区绑定到目标 GL_DRAW_INDIRECT_BUFFER
,则 indirect 参数被解释为基本机器单位中的偏移量这个缓冲区。
因此您需要在绘制元素之前绑定 GL_DRAW_INDIRECT_BUFFER
,但是 indirect 参数必须是 null
:
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, this.modelManager.indirect, NB_TYPE_MESH, 0);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, vboIdIndirect);
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, null, NB_TYPE_MESH, 0);