#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main() {
// 初始化GLFW
if (!glfwInit()) {
return -1;
}
// 创建窗口
GLFWwindow* window = glfwCreateWindow(640, 480, "VAO and VBO Example", NULL, NULL);
if (!window) {
glfwTerminate();
return -1;
}
// 使窗口的上下文成为当前线程的主上下文
glfwMakeContextCurrent(window);
// 初始化GLEW
if (glewInit() != GLEW_OK) {
return -1;
}
// 顶点数据
GLfloat 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 // 位置, 颜色
};
// 生成VBO
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 生成VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// 配置顶点属性
glEnableVertexAttribArray(0); // 位置属性
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(1); // 颜色属性
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
// 解绑VAO和VBO
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// 渲染循环
while (!glfwWindowShouldClose(window)) {
// 处理输入
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
// 清屏
glClear(GL_COLOR_BUFFER_BIT);
// 绑定VAO并绘制
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
// 交换缓冲区并处理事件
glfwSwapBuffers(window);
glfwPollEvents();
}
// 清理资源
glDeleteVertexArrays(1, &vao);
glDeleteBuffers(1, &vbo);
// 终止GLFW
glfwTerminate();
return 0;
}
VBO 用于存储顶点数据,减少CPU和GPU之间的数据传输开销。
VAO 用于存储顶点属性的配置信息,简化渲染调用。
通过结合使用VAO和VBO,可以高效地管理和渲染复杂的3D模型。