将顶点阵列对象与顶点缓冲区相结合索引缓冲区

时间:2016-06-23 18:52:05

标签: qt opengl

我正在尝试将顶点数组对象与顶点缓冲区&组合。使用Qt的索引缓冲区。

以下代码结合了VAO和VBO,完美运行:

// Create buffers
void Tile::setupBuffers() {
    vbo.create();
    vbo.bind();
    vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
    vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
    vbo.release();

    vao.create();

    shaderProgram->bind();
    vao.bind();
        vbo.bind();
        shaderProgram->enableAttributeArray(0);
        shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);    
    vao.release();

    shaderProgram->disableAttributeArray(0);
    vbo.release();
    shaderProgram->release();
}

// Draw triangle    
void Tile::draw() {
    shaderProgram->bind();
    vao.bind();

    glDrawArrays(GL_TRIANGLES, 0, 3);

    vao.release();
    shaderProgram->release();
}

当我现在尝试添加索引缓冲区时,除了清晰的颜色外,不会绘制任何内容。这是代码:

// Create buffers
void Tile::setupBuffers() {
    vbo.create();
    vbo.bind();
    vbo.setUsagePattern(QOpenGLBuffer::StaticDraw);
    vbo.allocate(vertices.constData(), vertices.size() * sizeof(QVector3D));
    vbo.release();

    ibo.create();
    ibo.bind();
    ibo.setUsagePattern(QOpenGLBuffer::StaticDraw);
    ibo.allocate(indices.constData(), indices.size() * sizeof(GLushort));
    ibo.release();

    vao.create();

    shaderProgram->bind();
    vao.bind();
        vbo.bind();
        shaderProgram->enableAttributeArray(0);
        shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0);

        ibo.bind();
    vao.release();

    shaderProgram->disableAttributeArray(0);
    vbo.release();
    ibo.release();
    shaderProgram->release();
}

void Tile::draw() {
    shaderProgram->bind();
    vao.bind();

    glDrawElements(GL_TRIANGLES, 3, GL_FLOAT, 0);

    vao.release();
    shaderProgram->release();
}

这是我的顶点矢量&的内容。索引向量:

vertices = {
    QVector3D(1.0f, -1.0f, 0.0f),
    QVector3D(1.0f, 1.0f, 0.0f),
    QVector3D(-1.0f, -1.0f, 0.0f)
};

indices = {
     0, 1, 2
};

我假设在第二个代码块中绑定VAO / VBO / IBO的顺序是错误的,我只是不知道它是如何正确完成的。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

GLushort

您的索引是GL_INVALID_ENUM s,而不是浮点数。您应该收到shaderProgram->disableAttributeArray(0);错误;你应该经常检查GL错误。

此外,shaderProgram->enableAttributeArray(0); shaderProgram->setAttributeBuffer(positionLocation, GL_FLOAT, 0, 3, 0); 完全没必要。启用/禁用状态是VAO的一部分(相反,Qt的愚蠢包装)。由于您取消了该属性,因此禁用该属性不会更改VAO。而且你无论如何也不想禁用它。

最后,有这个:

|

这两个函数的第一个参数应该相同。他们可能是,所以这更像是一个良性的错误。但它仍然是错误的。