本文介紹了為什么在調用glMultiDrawElementsInDirect時出現INVALID_OPERATION錯誤的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我當前正在嘗試將glMultiDrawElementsIndirect
與Java中的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);
索引包含NB_TYPE_MESH
網格類型的索引
推薦答案
如果在調用glMultiDrawElementsIndirect
時將緩沖區綁定到目標GL_DRAW_INDIRECT_BUFFER
,間接參數將被解釋為進入此緩沖區的以基本計算機單位為單位的偏移量。
因此在繪制元素之前需要綁定GL_DRAW_INDIRECT_BUFFER
,但間接參數必須為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()
這篇關于為什么在調用glMultiDrawElementsInDirect時出現INVALID_OPERATION錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,