OpenGL VAO 和VBO对象

ljsrvy3e  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(159)

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

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,这个可以正常工作。但是如果我创建了另一个对象(我不会使用它),我再次绘制第一个对象的结果是不正确的(例如,显示的对象在其他地方)。为什么?

olhwl3o2

olhwl3o21#

你似乎没有把vao存储在任何地方,但是你应该这样做。在绘制每个对象之前,你应该在调用任何glDraw*之前把glBindVertexArray存储在它的vao(而不是_vertexBufferID)。
另请参见this answer,了解VAO包含的状态。

相关问题