当前位置: 首页 > article >正文

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模型。


http://www.kler.cn/a/376424.html

相关文章:

  • 求最大公约数,最小公倍数
  • linux 上使用 D-Bus 控制Onboard
  • 【STM32】通过 DWT 实现毫秒级延时
  • Win10搭建SFTP服务器
  • Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换
  • 安防被动红外和主动红外
  • macOS Sequoia 15.1 (24B83) 正式版 ISO、IPSW、PKG 下载
  • unity学习-异步场景加载
  • [论文阅读] | 智能体长期记忆
  • STM32F103的CAN通讯接收测试
  • 项目模块十二:TcpServer模块
  • 恋爱脑学Rust之dyn关键字的作用
  • [UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)
  • 树莓派5实时时钟(RTC)
  • Ubuntu18升级cmake3.10到cmake3.18
  • AG32系列只用CPLD功能的,CLK从哪个引脚输入呢
  • BGP实验--BGP路由反射器
  • 电能质量治理产品在分布式光伏电站的应用
  • centos 7.9 下载安装mysql5.7
  • 前端 react 面试题(二)
  • JAVA利用方法实现四道题
  • Spring AI : 让ChatGPT成为你构建应用的核心亮点
  • 字符串统计(Python)
  • 什么是 HTTP 代理?它如何工作?
  • Unity 6 来袭
  • 一个系列搞懂23种设计模式