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
我有一个 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