我上周开始玩OpenGL 3.3+,当我试图让索引绘图工作时我遇到了这个问题。现在,我只想尝试使用IBO绘制一个三角形。
索引缓冲区和indexHandle
:
int[] tIndices = {
0, 1, 2
};
IntBuffer indexBuffer = BufferUtils.createIntBuffer(tIndices.length);
indexBuffer.put(tIndices);
indexBuffer.flip();
int indexHandle = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexHandle);
glBufferData(indexHandle, indexBuffer, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
这是我程序中的主要绘图循环,没有任何内容:
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programHandle);
glBindVertexArray(vaoHandle);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexHandle);
// This call does nothing v
glDrawElements(GL_TRIANGLE_STRIP, tIndices.length, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glUseProgram(0);
Display.update();
}
这是glDrawElements(int, IntBuffer)
变体的主循环(它绘制了我的三角形):
while (!Display.isCloseRequested()) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(programHandle);
glBindVertexArray(vaoHandle);
glEnableVertexAttribArray(0);
// indexBuffer is an IntBuffer
glDrawElements(GL_TRIANGLES, indexBuffer);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
glUseProgram(0);
Display.update();
}
有人可以向我解释为什么第一个街区根本没有绘制任何东西吗?我做错了什么?
此外,第二块在600x600窗口上以约1.3k FPS运行,而第一块约为800 FPS。这是为什么?
如果有人需要,我会在早上提供更多信息
答案 0 :(得分:2)
glBufferData()
的第一个参数对于索引缓冲区是错误的。你有这个:
glBufferData(indexHandle, indexBuffer, GL_STATIC_DRAW);
第一个参数是目标,而不是缓冲区ID。它看起来应该是这样的:
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW);