【问题标题】:Why do I get error INVALID_OPERATION when I call glMultiDrawElementsIndirect为什么我在调用 glMultiDrawElementsIndirect 时收到错误 INVALID_OPERATION
【发布时间】: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_BUFFERGL_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无关,使用该常量作为glMultiDrawElementsIndirectdrawcount参数肯定是错误的。
  • 我想多次绘制 2 种网格。所以在我的情况下 NB_TYPE_MESH = 2.
  • @Rabbid76 我认为 drawcount 不是问题,因为如果我给出其他值,我会得到另一个错误,IllegalArgumentException。如果不是这个功能,我必须使用哪个功能?
  • @Rabbid76 对不起,我不明白这显然是在做我想做的事。
  • @Joezzz 见glMultiDrawElementsIndirectGL_INVALID_VALUE 如果 stride 不是四的倍数或 drawcount 为负,则生成。您的代码中似乎并非如此。所以请提供Minimal, Reproducible Example

标签: java opengl lwjgl


【解决方案1】:

如果在调用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 Code Examples glMultiDrawElementsIndirect()

【讨论】:

  • 修复后我没有得到错误,但没有一个对象被绘制。
  • @Joezzz 你认为我应该怎么做?我看不到您的代码,也无法调试您的代码。
  • 是的,我知道,发布最小的可重现代码太难了
  • @Joezzz 注意。你解决了一个问题,现在面对下一个问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2023-03-12
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多