在OpenGL中,顶点数组对象(Vertex Array Object, VAO)是一个用于存储顶点缓冲对象(Vertex Buffer Object, VBO)和顶点属性指针设置的OpenGL对象。使用VAO可以简化绘制物体的过程,因为它会记录所有与顶点属性相关的配置,这样我们只需在绘制时绑定对应的VAO,OpenGL就会自动恢复之前的设置。
设置VAO的基本步骤如下:
- 生成一个顶点数组对象
- 绑定顶点数组对象
- 创建和绑定一个顶点缓冲对象
- 向顶点缓冲对象中填充顶点数据
- 设置顶点属性指针
- 解绑顶点数组对象和顶点缓冲对象
#include <GL/glew.h>
#include <GLFW/glfw3.h>
// 顶点数据
float vertices[] = {
-0.5f, -0.5f, 0.0f, // 左下角
0.5f, -0.5f, 0.0f, // 右下角
0.0f, 0.5f, 0.0f // 顶点
};
int main() {
// ... 初始化OpenGL和GLFW的代码 ...
// 1. 生成一个顶点数组对象
GLuint VAO;
glGenVertexArrays(1, &VAO);
// 2. 绑定顶点数组对象
glBindVertexArray(VAO);
// 3. 创建和绑定一个顶点缓冲对象
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
// 4. 向顶点缓冲对象中填充顶点数据
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 5. 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 6. 解绑顶点数组对象和顶点缓冲对象
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// ... 渲染循环等其他代码 ...
// 在渲染循环中绘制三角形
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
// ... 释放资源和退出的代码 ...
}