java - LWJGL glDrawElements(int, int, int, long) 不绘制任何内容,而 glDrawElements(int, IntBuffer) 正确绘制

标签 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();
}

有人可以向我解释为什么第一个 block 根本没有绘制任何东西吗?我做错了什么?

此外,第二个 block 在 600x600 窗口上的运行速度约为 1.3k FPS,而第一个 block 的运行速度约为 800 FPS。这是为什么?

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

最佳答案

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

glBufferData(indexHandle, indexBuffer, GL_STATIC_DRAW);

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

glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL_STATIC_DRAW);

关于java - LWJGL glDrawElements(int, int, int, long) 不绘制任何内容,而 glDrawElements(int, IntBuffer) 正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486563/

相关文章:

opengl - 如何将多个纹理传递给单个着色器?

c - 如何在考虑性能的情况下最好地用C编写体素引擎

Java/OpenGL : Getting the image of a Canvas as a BufferedImage

java - 在 hibernate 中加入数组

Java线程安全地将集合对象从一个线程传递到另一个线程

opengl - GLSL 分支行为

java - opengl 模具似乎没有效果

java - 下面代码中的 super 指向什么?

java - 用Java更新游戏记录