OpenGL窗口实现

2023-05-16

OpenGL窗口实现

  • 1 渲染循环包括的代码:
  • 2 完整代码及解释
  • 3 实现的结果

1 渲染循环包括的代码:

// 渲染循环
while(!glfwWindowShouldClose(window))
{
    // 输入
    processInput(window);

    // 渲染指令
    ...

    // 检查并调用事件,交换缓冲
    glfwPollEvents();
    glfwSwapBuffers(window);
}

2 完整代码及解释

#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <iostream>

//当用户改变窗口的大小的时候,视口也应该被调整。
//我们可以对窗口注册一个回调函数(Callback Function),
//它会在每次窗口大小被调整的时候被调用
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);

// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;

int main()
{
    // glfw: 初始化和版本配置
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    // glfw window creation 创建一个窗口对象 SCR_WIDTH(宽) SCR_HEIGHT(高) "LearnOpenGL"(名称)
    // --------------------
    GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    //通知GLFW将我们窗口的上下文设置为当前线程的主上下文
    glfwMakeContextCurrent(window);
    
    //我们还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数:
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // glad: load all OpenGL function pointers GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。
    // ---------------------------------------
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }    

    // render loop 渲染循环 让GLFW退出前一直保持运行
    // -----------
    while (!glfwWindowShouldClose(window))
    {
        // input
        // -----
        processInput(window);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        
        //函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
        //双缓冲(Double Buffer)
            /*应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 
            这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。
            最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。
            为了规避这些问题,我们应用双缓冲渲染窗口应用程序。
            前缓冲保存着最终输出的图像,它会在屏幕上显示;
            而所有的的渲染指令都会在后缓冲上绘制。
            当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。*/
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//glClearColor函数是一个状态设置函数
        glClear(GL_COLOR_BUFFER_BIT);//glClear函数则是一个状态使用的函数
        glfwSwapBuffers(window);

        //检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
        glfwPollEvents();
    }

    // glfw: terminate, clearing all previously allocated GLFW resources.
    // ------------------------------------------------------------------
    //当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源
    glfwTerminate();
    return 0;
}

// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------

//实现一些输入控制
void processInput(GLFWwindow *window)
{

    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    // make sure the viewport matches the new window dimensions; note that width and 
    // height will be significantly larger than specified on retina displays.
    //在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,
    //即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标
    //glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度
    glViewport(0, 0, width, height);
}

3 实现的结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL窗口实现 的相关文章

  • 建立二叉树

    一颗二叉树 创建结点 typedef struct node int data node lchild node rchild node lchild NULL rchild NULL Tree tree 建树 tree bulid tre
  • 学习STL的历程——关联容器

    STL模板库包括了容器 算法 迭代器 仿函数 适配器 分配器 主要谈谈容器 STL中的容器有序列容器和关联容器 xff0c 容器适配器等 1 xff09 序列容器 xff08 以线性序列的方式存储元素 xff0c 没对元素进行排序 xff0
  • STL三角网格模型体积计算

    float STLVolume float vols 61 0 for int i 61 0 i lt Tmesh gt faces size i 43 43 vec p1 61 Tmesh gt vertices Tmesh gt fac
  • Abaqus齿轮有限元分析

    齿轮啮合模拟 整理好的文件放在资源里了 xff0c 直接解压即可齿轮有限元分析 保姆级步骤如下 xff08 废话少说直接看图片设置 xff09 xff1a 首先先对齿轮模型划分网格 xff0c 该分析所用的前处理软件为Hypermesh x
  • const成员函数

    const成员函数 const修饰的类成员函数称为const成员函数 xff0c const修饰类成员函数 xff0c 实际修饰该成员函数隐含的this指针 xff0c 表明在该成员函数中不能对类的任何成员进行修改 如下图所示 xff1a
  • 设计模式——单例模式

    为什么单例模式中的成员函数都是静态的 xff1f 你只要弄明白单例模式是如何实现的 xff0c 就能从本质上理解这个问题 xff1b 单例模式实现过程如下 xff1a 首先 xff0c 将该类的构造函数私有化 xff08 目的是禁止其他程序
  • c/c++链表学习

    链表学习持续更新 这边设置链表的节点 xff0c 里面包含两个信息分别是数据域 xff08 可以用自己写的类或者基本数据结构 xff0c 为了简便这边直接使用基本数据类型 xff09 和指向下一节点的指针 struct SeqList in
  • c++面试知识整理

    C 43 43 基础部分 1 基础知识1 1 内存1 1 0 内存四区1 1 1 简述C C 43 43 程序编译的内存分配情况1 1 2 分配函数与释放函数 1 2 预编译1 2 1 头文件 lt gt lt gt
  • Windows中使用Netsh Winsock Reset命令解决网络连接问题

    有人反馈电脑无法联网 xff0c Chrome IE TIM等无法正常使用 xff0c 我检查后发现了以下情况 xff1a 1 电脑网络适配器设置处显示网络连接正常 xff0c 并且正确获取到了内网域的名称 xff1b 网络的IP 掩码 D
  • 深浅拷贝问题

    深浅拷贝 指针释放两次深浅拷贝补充解决方法 指针释放两次 再讲深浅拷贝之前先谈一谈如果对开辟内存的指针同时释放两次会发生什么情况 span class token keyword int span span class token oper
  • STL模型渲染

    渲染 xff08 render xff09 STL模型渲染 齿轮 龙 通过离线渲染获得的模型和场景
  • 树的一些题目持续整理

    树 树的最大深度合并二叉树 树的最大深度 输入一棵二叉树的根节点 xff0c 求该树的深度 从根节点到叶节点依次经过的节点 xff08 含根 叶节点 xff09 形成树的一条路径 xff0c 最长路径的长度为树的深度 span class
  • C++四种强制转换

    c 43 43 类型转换 1 static cast 静态类型转换 2 dynamic cast 动态类型转换 3 const cast xff08 去const属性 xff09 4 reinterpret cast 不相关类型的转换 1
  • TCP/IP基础知识

    TCP IP OSI七层模型 Open System Interconnect 数据链路层网络层TCP UDPDNSTCP连接的建立与终止三次握手为什么要三次握手 xff1f 四次挥手为什么要四次挥手 xff1f OSI七层模型 Open
  • 材料力学的一些东西

    力学属性 强度刚度弹性模量柔度韧性脆性 强度 强度是指表示工程材料抵抗断裂和过度变形的力学性能之一 常用的强度性能指标有拉伸强度和屈服强度 xff08 或屈服点 xff09 铸铁 无机材料没有屈服现象 xff0c 故只用拉伸强度来衡量其强度
  • 操作符重载一些细节

    操作符重载一些注意事项 不能重载操作符只在类的成员函数中重载的操作符只在友元函数中重载的操作符补充 不能重载操作符 34 34 xff08 类成员访问运算符 xff09 34 34 xff08 类成员指针访问运算符 xff09 34 34
  • 容器学习历程——容器适配器

    容器适配器 stack 栈 xff09 queue 队列 xff09 priority queue 优先队列 xff09 stack 栈 xff09 FILO 先进后出 xff09 底层通过deque实现 span class token
  • 坐标位置实时显示

    MFC程序实时显示鼠标坐标位置 在MFC单文档中快速实现坐标点附上代码 xff1a span class token keyword void span span class token class name CVoronoi2View s
  • ABAQUS自定义载荷分布

    ABAQUS自定义载荷分布 用abaqus进行模拟足底压力时遇到了一个问题 xff0c 足底压力传感器测出来的数据每块区域的数值都不同 xff0c 如果对每块区域都一个个选中然后赋值那效率太低太低了 xff0c 若是直接选中某块区域 xff
  • 域控之DNS转发器

    系统环境 xff1a Windows Server 2012 R2 Datacenter 现象 xff1a 将域环境中的主机的DNS服务器地址指向网关时 xff0c 访问外网正常 xff1b 将DNS服务器地址指向指向域控后 xff0c 可

随机推荐

  • cmd 运行main函数

    C m a k e Cmake C m a k e 文件大多数由控制台程序运行 xff0c 由于
  • 入栈,出栈顺序

    入栈 xff0c 出栈顺序 在刚开始做到栈的出栈入栈时还是蛮有疑惑的 xff0c 搞不清楚出入栈的排序重新整理之后终于明白 xff0c 具体如下所示 xff1a 例如有一个为 A B C D E
  • MFC键盘交互

    MFC键盘交互 首先设置键盘按键消息响应 span class token keyword void span span class token class name CFeatureReuseView span span class to
  • 手撕字符串函数

    实现 s t r c p y strcpy s t r c p y 函数 span class token key span
  • 牛客编程输入输出

    牛客笔试编程输入输出 首先需要把该包含的头文件包含进来 结构类型类似于 span class token macro property span class token directive hash span span class toke
  • VS检查内存泄露的方法

    Visual Studio检查内存泄露方法 CrtDumpMemoryLeaks函数Visual Leak Detector xff08 VLD xff09 插件VS2015内存快照 CrtDumpMemoryLeaks函数 系统自带的 C
  • 计算机图形学中的渲染管线

    渲染管线 具体流程图顶点着色器光栅化片段着色器测试混合阶段 具体流程图 步骤 xff1a 1 首先输入了1 xff0c 2 xff0c 3 xff0c 4四个顶点的数据 2 Vertex Processing 经过变换 投影等操作 xff0
  • 计算机图形学中的几何

    计算机图形学中的几何 几何表示方法1 显示表示1 1 显示几何 Explicit Representations 2 隐式表示 几何表示方法 1 显示表示 理解为能够通过参数映射的方法来定义几何形状 xff0c 可以很轻易的采样到所有的点
  • 计算机图形学中的曲线曲面

    计算机图形学中的曲线曲面 1 曲线1 1 Bezier curves xff08 贝塞尔曲线 xff09 1 2 B spline B样条 1 3 NURBS 非均匀有理B样条 xff09 2 曲面2 1 Bezier Surfaces x
  • Docker停电事件未解之谜

    事件简介 xff1a 周末出现了一次偶然的停电事故 xff0c 供电恢复后 xff0c 按照惯例重启服务器 xff0c 并重新运行各项服务 然而 xff0c 一台Ubuntu 16 04服务器的Docker容器无法启动了 1 启动容器报错
  • 布尔运算(Boolean Operators)

    布尔操作 xff08 Boolean Operators xff09 1 构造实体几何 CSG 2 布尔操作类型3 布尔操作部分代码 1 构造实体几何 CSG 构造实体几何允许建模者通过使用布尔运算符组合更简单的对象来创建复杂的曲面或对象
  • 八叉树的相关内容

    根据点云数据构建八叉树 span class token macro property span class token directive hash span span class token directive keyword prag
  • VS+git+CMake实现代码运行

    git 43 CMake实现代码运行 1 获取 github 仓库中的代码2 CMake 基本步骤3 CMake 遇到问题1 没提供xxx cmake 在路径中 4 ALL BUILD ZERO CHECK INSTALL 1 获取 git
  • CPU和GPU及CUDA入门基础概念

    CPU与GPU 1 CPU与GPU的关系 smile 1 1 CPU与GPU各自特点 2 一些零碎的CUDA入门知识 blush 2 1 函数修饰符2 2 线程 线程快 线程格2 3 什么是核函数 smiley 2 4 常用的GPU内存函数
  • 原始三维格子点内部实现小范围格子重建

    在原始N M的数组A中 xff08 该数组可以理解为规则格子 xff0c 各维度的增量均为常数 xff09 内部构建一个比其小的数组B xff0c 要求数组B与A格子点重合 xff0c 如图所示 xff1a 对于三维空间的数组来讲 xff0
  • csdn Markdown样式

    CSDN markdown样式 1 文字样式2 段落格式3 图片样式4 公式样式5 分享一些表情 1 文字样式 x1f449 字体样式 span class token operator lt span font span class to
  • Java入门基础知识

    JAVA基础知识记录 1 基础内容2 相关知识链接 写在最前面 xff1a 之前自学Java用的是 Eclipse 1 基础内容 常量 final相当于c 43 43 中的const 数组 int number 61 new int 100
  • 最全计算机图形学面试资料整理

    计算机图形学面试资料整理 1 什么是渲染管线2 有那几个坐标系 xff08 空间 xff09 xff1f 如何在空间之间进行转换 xff1f 3 三个重要的空间变换矩阵4 视口变换是什么 xff1f 5 顶点缓冲对象 xff08 Verte
  • OpenGL状态机

    OpenGL状态机 1 什么是状态机 xff1f 2 OpenGL状态机 1 什么是状态机 xff1f 先来解释什么是 状态 State 现实事物是有不同状态的 xff0c 例如一个自动门 xff0c 就有 open 和 closed 两种
  • OpenGL窗口实现

    OpenGL窗口实现 1 渲染循环包括的代码 xff1a 2 完整代码及解释3 实现的结果 1 渲染循环包括的代码 xff1a span class token comment 渲染循环 span span class token keyw