【发布时间】:2021-01-23 13:10:37
【问题描述】:
我目前正在尝试在 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 网格类型的索引
【问题讨论】:
-
不知道
NB_TYPE_MESH应该是什么,但它与OpenGL无关,使用该常量作为glMultiDrawElementsIndirect的drawcount参数肯定是错误的。 -
我想多次绘制 2 种网格。所以在我的情况下 NB_TYPE_MESH = 2.
-
@Rabbid76 我认为 drawcount 不是问题,因为如果我给出其他值,我会得到另一个错误,IllegalArgumentException。如果不是这个功能,我必须使用哪个功能?
-
@Rabbid76 对不起,我不明白这显然是在做我想做的事。
-
@Joezzz 见
glMultiDrawElementsIndirect。GL_INVALID_VALUE如果 stride 不是四的倍数或 drawcount 为负,则生成。您的代码中似乎并非如此。所以请提供Minimal, Reproducible Example。