opengl学习-2vao和vbo(通义千问的例子)
#include <GL/glew.h>
#include <GLFW/glfw3.h>int main() {// 初始化GLFWif (!glfwInit()) {return -1;}// 创建窗口GLFWwindow* window = glfwCreateWindow(640, 480, "VAO and VBO Example", NULL, NULL);if (!window) {glfwTerminate();return -1;}// 使窗口的上下文成为当前线程的主上下文glfwMakeContextCurrent(window);// 初始化GLEWif (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 // 位置, 颜色};// 生成VBOGLuint vbo;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 生成VAOGLuint 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和VBOglBindVertexArray(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);// 终止GLFWglfwTerminate();return 0;
}
VBO 用于存储顶点数据,减少CPU和GPU之间的数据传输开销。
VAO 用于存储顶点属性的配置信息,简化渲染调用。
通过结合使用VAO和VBO,可以高效地管理和渲染复杂的3D模型。