创建与删除VBO
我们可以使用glGenBuffers创建VBO,使用glDeleteBuffers删除VBO。
#define GL_CALL(func) func;checkError();
void prepare()
{
// 创建一个VBO, 此时还没有真正分配显存
GLuint vbo = 0;
GL_CALL(glGenBuffers(1, &vbo));
// 销毁一个VBO
GL_CALL(glDeleteBuffers(1, &vbo));
// 创建n个VBO
GLuint vboArr[] = {0, 0, 0};
GL_CALL(glGenBuffers(3, vboArr));
// 销毁n个VBO
GL_CALL(glDeleteBuffers(3, vboArr));
}
VBO的绑定与数据更新
绑定:将某个资源与OpenGL状态机中的某个状态插槽进行关联
| API | 功能 |
|---|---|
| glBindBuffer | 进行VBO绑定,将当前的vbo绑定到OpenGL状态机的哪个状态插槽 |
| glBufferData | 往VBO中填入数据,此时会申请显存空间 |
代码
void prepare()
{
// VBO顶点数据
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
// 1, 生成一个VBO
GLuint vbo = 0;
glGenBuffers(1, &vbo);
// 2, 绑定当前VBO到OpenGL的VBO插槽上
// GL_ARRAY_BUFFER表示当前VBO这个插槽
glBindBuffer(GL_ARRAY_BUFFER, vbo);
// 3,向当前VBO传输数据,也是在开辟显存
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}
VBO多属性数据
三角形有三个顶点,每个顶点也有数据,下面我们将这些数据传给OpenGL。
singleBuffer策略
void prepareSingleBuffer()
{
// 1, 准备顶点位置数据与颜色数据
float positions[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
float colors[] = {
1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f
};
// 2, 为位置和颜色数据各自生成一个VBO
GLuint posVbo = 0, colorVbo = 0;
glGenBuffers(1, &posVbo);
glGenBuffers(1, &colorVbo);
// 3, 给两个分开的VBO各自填充数据
glBindBuffer(GL_ARRAY_BUFFER, posVbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
}
将位置和颜色存储到一起(InterleavedBuffer)
void prepareInterleavedBuffer()
{
float vertices[] = {
-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 第一个顶点的位置和颜色,前三个数据为顶点数据,后三个为第一个顶点的颜色数据
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 第二个顶点的位置和颜色
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 第三个顶点的位置和颜色
};
GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}