Opengl VAO和VBO对象

时间:2017-01-15 06:36:45

标签: opengl

我想在对象中创建多个顶点缓冲区(逐个对象)。构造函数是:

VertexBuffer::VertexBuffer(const GLvoid *data,
                           GLsizeiptr size,
                           GLenum mode, 
                           GLsizei count, 
                           GLsizei stride,
                           ShaderInterface *shaderInterface,
                           GLvoid *positionOffset,
                           GLvoid *normalOffset)
    : _mode(mode),
    _count(count),
    _stride(stride),
    _shaderInterface(shaderInterface),
    _positionOffset(positionOffset),
    _normalOffset(normalOffset)

{
    glGenBuffers(1, &_vertexBufferID);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

    //
    GLuint vao = 0;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glEnableVertexAttribArray(0); //??????
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferID);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    //
}

如果我创建一个对象VertexBuffer,这可以正常工作。但是如果我创建另一个对象(我不会使用它)并且我再次绘制第一个对象,则结果不正确(例如,显示的对象位于其他位置)。为什么呢?

1 个答案:

答案 0 :(得分:0)

您似乎无法将vao存储在任何地方,但您应该这样做。在绘制每个对象之前,在致电任何glBindVertexArray之前,您应vao _vertexBufferID(但不是glDraw*)。

另见this answer,了解VAO的实际状况。