opengl学习-2vao和vbo(通义千问的例子)

复制代码
#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模型。

相关推荐
mldong4 小时前
一个 App,十三套后端:手机审批端 uni-jeeflow-app 开源了
java·架构
tqs_123455 小时前
MySQL RR隔离级别死锁|Gap间隙锁、临键锁,订单并发范围查询死锁根因方案
java
逆境不可逃5 小时前
Pi Agent 学习笔记:多个工具怎样并行执行
java
尾善爱看海6 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
小弥儿6 小时前
GitHub今日热榜 | 2026-09-15:AI 智能体与本地生成工具领跑
学习·开源
Flynt6 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet6 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
驳是6 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
susplus6 小时前
【初识ARM】ARM相关基础概念
学习·arm
GreenTea6 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法