使用VBO的glDrawElements

时间:2015-09-02 18:01:01

标签: java opengl lwjgl

我想用索引缓冲区定义的顺序渲染我的顶点。

如果我使用

glDrawElements(int mode, ByteBuffer indices);

一切正常,但是如果我想将这些数据上传到GL_ELEMENT_ARRAY_BUFFER,我会得到一个黑屏和glError 1281。

这是我的代码:

public void buildBuffer() {

        //generate VBOs

        FloatBuffer buffer = BufferUtils.createFloatBuffer(this.model.getVertexData().size() * 3);
        for (float[] f : this.model.getVertexData()) {
            buffer.put(f);
        }
        buffer.flip();
        glBindBuffer(GL_ARRAY_BUFFER, this.vVBO);
        glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);

        ByteBuffer ibuffer = BufferUtils.createByteBuffer(3);
        ibuffer.put((byte) 1);
        ibuffer.put((byte) 2);
        ibuffer.put((byte) 3);
        ibuffer.flip();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this.iVBO);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, ibuffer, GL_STATIC_DRAW);


        glBindVertexArray(this.VAO);

        glBindBuffer(GL_ARRAY_BUFFER, this.vVBO);
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);

        glBindVertexArray(0);
    }

    public void draw() {

        this.shader.use();
        glBindVertexArray(this.VAO);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this.iVBO);
        glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, 0);

        glBindVertexArray(0);
        Shader.NONE.use();
    }

1 个答案:

答案 0 :(得分:0)

这很难说,但我会尝试拍摄它。

在绑定顶点数组之前,您永远不会实际创建VAO,您必须将VAO设置为vaoID = GL30.glGenVertexArrays();

当您将数据数组放入FloatBuffer时,您不需要for循环。它就像buffer.put(vertices);一样简单。