如果我的VBO类引用顶点数组,数据是否仍然存储在GPU上?

时间:2015-12-24 18:15:13

标签: c++ opengl vbo vao

很简单,我的问题是这个。我的代码如下所示,用于在OpenGL中跟踪和处理顶点缓冲区对象的C ++头文件。为了符合核心标准,它必须使用顶点数组(VAO)。由于调用了glGenVertexArrays()和其他相关方法,这种渲染方法是否仍然存储在GPU或RAM中的信息?

class VertexBuffer
{
private:
    int vertCount;

    GLuint vertArray;
    GLuint vertBuffer;

public:
    VertexBuffer();
    void renderInterleaved();
    void createInterleaved(GLfloat*, int);
    void destroy();

    GLuint* getVboId();
};

VertexBuffer::VertexBuffer()
{
    glGenVertexArrays(1, &vertArray);
    glGenBuffers(1, &vertBuffer);
}

void VertexBuffer::renderInterleaved()
{
    glBindVertexArray(vertArray);
    glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    int stride = 7 * sizeof(GLfloat);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*) 0);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, stride, (void*)(3 * sizeof(GLfloat)));
    glDrawArrays(GL_TRIANGLES, 0, vertCount);

    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
}

void VertexBuffer::createInterleaved(GLfloat* data, int vertices)
{
    vertCount = vertices;
    glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
    glBufferData(GL_ARRAY_BUFFER, vertices * 21 * sizeof(GLfloat), data, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void VertexBuffer::destroy()
{
    glDeleteBuffers(1, &vertBuffer);
    glDeleteVertexArrays(1, &vertArray);
}

GLuint* VertexBuffer::getVboId()
{
    return &vertBuffer;
}

1 个答案:

答案 0 :(得分:4)

术语"顶点缓冲对象"是,并且一直是一个用词不当,由引入缓冲区对象的扩展的不幸命名创建。

没有"顶点缓冲区对象。"只有buffer object,表示OpenGL管理的内存的线性数组。缓冲区对象可以用于存储顶点数据以进行渲染操作,但是没有任何关于任何特定缓冲区对象的内在可以让它做到这一点。这只是你如何使用它的问题。

如果您的对象封装了您将用于glVertexAttribPointer的参数,那么它不会仅封装缓冲区对象。缓冲区对象不知道如何呈现自身或它包含哪些数据;它只是一个缓冲区。它所代表的最接近的OpenGL概念是一个顶点数组对象。

但是你的代码也没有真正使用VAO。每次拨打renderInterleaved时,您都会设置已作为VAO的一部分存储的状态。所有这些glVertexAttribPointerglEnableVertexAttribArray来电都会记录到VAO中。这是你应该设置一次的东西,然后再绑定VAO并用它渲染。所以,是的,它是效率较低的VAO。

但是你的类封装了更多而不是VAO。它知道如何渲染自己。所以你班上最好的名字是" mesh"或者那种效果。