当我遇到这个问题时,我试图在屏幕上创建一个正方形并对其进行纹理处理,"当禁用元素阵列缓冲区对象时,不能使用偏移量#34;。错误来自该行,
GL11.glDrawElements(GL11.GL_TRIANGLES,model.getVertexCount(),GL11.GL_UNSIGNED_INT,0);
以下是我的一些代码:
渲染器方法:
这会渲染东西
RawModel model = texturedModel.getRawmodel();
GL30.glBindVertexArray(model.getVaoID());
GL20.glEnableVertexAttribArray(0);
GL20.glEnableVertexAttribArray(1);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D,texturedModel.getTexture().getID());
GL11.glDrawElements(GL11.GL_TRIANGLES,model.getVertexCount(),GL11.GL_UNSIGNED_INT,0);
GL20.glDisableVertexAttribArray(0);
GL20.glDisableVertexAttribArray(1);
GL30.glBindVertexArray(0);
bindIndicesBuffer方法:
这会创建一个vbo,将其绑定,并在方法结束时将其解除绑定
int vboID = GL15.glGenBuffers();
vbos.add(vboID);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID);
IntBuffer buffer = putIndicesInIntBuffer(indices);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
我注意到当我删除该行时,
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
该程序不会给我这个错误
我认为在不解除绑定的情况下保留绑定的vbo绑定是低效的,但我不确定
我应该解决另一个问题,还是让vbo保持约束状态。
我知道有一些问题可以解决这个问题但是,它们并没有那么大的帮助。
如果我对这个问题感到愚蠢,我很抱歉。我是一个opengl noob,我正在跟进一个教程系列,所以我并不完全理解所有这些代码。 :(
答案 0 :(得分:1)
元素缓冲区是VAO状态的一部分。因此,当你绑定它时,你真的将它附加到VAO。因此,当您解除绑定时,您不会在VAO中放置任何元素缓冲区。然后你尝试进行索引渲染,没有连接到VAO的元素缓冲区。
所以是的,你需要将元素缓冲区附加到VAO。