为什么 glDrawElements() 不绘制任何东西?

Why is glDrawElements() not drawing anything?

我已经看到几个关于同一主题的问题,但仍然无法弄清楚我的代码有什么问题。

获得 window 运行 的效果,其中按键会更改 glClearColor() 的背景颜色。

但是现在,当尝试在屏幕上绘制四边形时,屏幕保持黑色。 我认为它应该如何工作的小总结:

如何创建 mesh

public Mesh(Vertex[] verts, int[] indices) {
    this.verts = verts;
    this.indices = indices;
}

//Differend class
public Mesh mesh = new Mesh(new Vertex[] {
        new Vertex(new Vector3f(-0.5f,  0.5f, 0.0f)),
        new Vertex(new Vector3f(-0.5f, -0.5f, 0.0f)),
        new Vertex(new Vector3f( 0.5f, -0.5f, 0.0f)),
        new Vertex(new Vector3f( 0.5f,  0.5f, 0.0f))
    }, new int[] {
        0, 1, 2,
        0, 3, 2
    });

为了初始化游戏,这叫做:

public void create() {
    vao = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(vao);

    FloatBuffer positionBuffer = MemoryUtil.memAllocFloat(verts.length * 3);
    float[] positionData = new float[verts.length * 3];
    for (int i = 0; i < verts.length; i++) {
        positionData[i * 3] = verts[i].getPosition().getX();
        positionData[i * 3 + 1] = verts[i].getPosition().getY();
        positionData[i * 3 + 2] = verts[i].getPosition().getZ();
    }

    positionBuffer.put(positionData).flip();

    pbo = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, pbo);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, positionBuffer, GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

    IntBuffer indexBuffer = MemoryUtil.memAllocInt(indices.length * 3);
    indexBuffer.put(indices).flip();

    ibo = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBuffer, GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
}

最后,mesh 应该这样渲染:

public void renderMesh(Mesh mesh) {
    clear();

    GL30.glBindVertexArray(mesh.getVAO());
    GL30.glEnableVertexAttribArray(0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, mesh.getIBO());
    GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_FLOAT, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL30.glDisableVertexAttribArray(0);
    GL30.glBindVertexArray(0);
}

我已经检查过这些方法实际上是通过使用 System.out.println 调用的。 游戏的输入仍然有效。只是屏幕是黑色的,没有显示任何四边形。 为什么它不在屏幕上绘制任何东西?

设置为glDrawElements hs 的类型参数对应于索引缓冲区,而不是顶点缓冲区。
在您的情况下,它必须是 GL_UNSIGNED_INT 而不是 GL_FLOAT。参见 glDrawElements

GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_FLOAT, 0);

GL11.glDrawElements(GL11.GL_TRIANGLES, mesh.getIndices().length, GL11.GL_UNSIGNED_INT, 0);

请注意,GL_FLOAT 不是 glDrawElements 的可接受值,会导致 INVALID_ENUM 错误。