OpenGL VBO 放在 class 中时不显示任何内容

OpenGL VBO doesn't show anything when it is put in a class

我有一个 OpenGL 项目,我想在其中将所有对象包装在 classes 中。我从 VBO 开始。在包装之前,代码看起来像这样:

// includes
int main()
{
    // init OpenGL
    GLfloat vertices[] = {
        // vertices
    };
    GLint VBO;
    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    // more stuff
    // create VAO
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // more stuff
}

这按预期工作。 我做了一个 class 看起来像这样:

// vbo.h
#ifndef VBO_H
#define VBO_H

// includes

class VBO
{
public:
    VBO(GLfloat *, GLenum);
    ~VBO();

    void bind();
    void unbind();

    GLuint id;
};

#endif

// vbo.cpp
#include "vbo.h"

VBO::VBO(GLfloat *vertices, GLenum type)
{
    glGenBuffers(1, &id);
    glBindBuffer(GL_ARRAY_BUFFER, id);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, type);
}

VBO::~VBO()
{
    glDeleteBuffers(1, &id);
}

void VBO::bind()
{
    glBindBuffer(GL_ARRAY_BUFFER, id);
}

void VBO::unbind()
{
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

并将 main 更改为如下所示:

// includes
#include "vbo.h"

int main()
{
    // init OpenGL
    GLfloat vertices[] = {
        // vertices
    };
    VBO vbo(vertices, GL_STATIC_DRAW);
    // more stuff
    // create VAO
    vbo.bind();
    // more stuff
}

现在它不渲染任何东西。我正在使用 OpenGL 3.3 版核心配置文件,我做错了什么?

使用 std::vector &vertices 而不是 float*

VBO::VBO(std::vector<float> &vertices, GLenum type)
{
    glGenBuffers(1, &id);
    glBindBuffer(GL_ARRAY_BUFFER, id);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], type);
}

创建自定义构造函数和赋值运算符也是个好主意,因为如果您构建多个副本,所有副本都将共享相同的 VAO 和 VBO,如果其中一个被删除,所有副本都将持有无效的 VAO 和 VBO