本文介紹了為什么在調(diào)用glMultiDrawElementsInDirect時(shí)出現(xiàn)INVALID_OPERATION錯(cuò)誤的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我當(dāng)前正在嘗試將glMultiDrawElementsIndirect
與Java中的LWJGL一起使用,但出現(xiàn)錯(cuò)誤INVALID_OPERATION。
glMultiDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, this.modelManager.indirect, NB_TYPE_MESH, 0);
我在文檔中看到此錯(cuò)誤與GL_DRAW_INDIRECT_BUFFER
或GL_ELEMENT_ARRAY_BUFFER
有關(guān),但我不知道問題在我的代碼中的哪里。
間接緩沖區(qū)
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);
和我的元素緩沖區(qū)
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
網(wǎng)格類型的索引
推薦答案
如果在調(diào)用glMultiDrawElementsIndirect
時(shí)將緩沖區(qū)綁定到目標(biāo)GL_DRAW_INDIRECT_BUFFER
,間接參數(shù)將被解釋為進(jìn)入此緩沖區(qū)的以基本計(jì)算機(jī)單位為單位的偏移量。
因此在繪制元素之前需要綁定GL_DRAW_INDIRECT_BUFFER
,但間接參數(shù)必須為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()
這篇關(guān)于為什么在調(diào)用glMultiDrawElementsInDirect時(shí)出現(xiàn)INVALID_OPERATION錯(cuò)誤的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,