LWJGL glDrawElements(int,int,int,long)没有绘制,而glDrawElements(int,IntBuffer)绘制正确

时间:2014-05-06 05:26:23

标签: java opengl lwjgl

我上周开始玩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。这是为什么?

如果有人需要,我会在早上提供更多信息

1 个答案:

答案 0 :(得分:2)

glBufferData()的第一个参数对于索引缓冲区是错误的。你有这个:

glBufferData(indexHandle, indexBuffer, GL_STATIC_DRAW);

第一个参数是目标,而不是缓冲区ID。它看起来应该是这样的:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW);