【OpenGL】窗口的创建

从今天开始我们开始学习OpenGL,从0开始,当然是有C++基础的前提

首先包含glad和GLFW的头文件

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

初始化 GLFW

在 main 函数中,我们首先使用 glfwInit 初始化 GLFW,然后我们可以使用 glfwWindowHint 配置 GLFW,这个配置的选项和含义可以在GLFW:窗口指南里面找到非常详细的解释,这个还是当成工具查阅就行,我们真正要操作的地方不在窗口初始化这里

int main() {glfwInit();  // 初始化GLFWglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 指定创建的内容必须兼容的客户端 API 版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定创建的内容必须兼容的客户端 API 版本glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 指定要为其创建内容的 OpenGL 配置文件//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 指定 OpenGL 内容是否应向前兼容return 0;
}

创建窗口对象

接下来,我们需要创建一个窗口对象,glfwCreateWindow 函数前两个参数是窗口的宽度和高度,第三个参数是窗口的名称,后面两个参数的作用可以在GLFW:窗口指南找到

glfwMakeContextCurrent(window)告诉 GLFW 将窗口的内容作为当前线程上的主要内容

    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);

初始化 GLAD

GLAD 管理 OpenGL 的函数指针,需要在调用任何 OpenGL 函数之前初始化 GLAD,我们向 GLAD 传递函数以加载特定于操作系统的 OpenGL 函数指针的地址,GLFW 为我们提供了glfwGetProcAddress,它根据我们编译的操作系统定义了正确的函数

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{std::cout << "Failed to initialize GLAD" << std::endl;return -1;
}    

渲染窗口调整 

用glViewport设置 OpenGL 渲染窗口的大小,前两个参数设置窗口左下角的位置,第三个和第四个参数以像素为单位设置渲染窗口的宽度和高度,如果视口尺寸设置为小于 GLFW 尺寸的值;然后,所有 OpenGL 渲染都将显示在一个较小的窗口中

glViewport(0, 0, 800, 600);

当用户调整窗口大小时,视口也应该进行相应的调整,注册一个函数将 GLFWwindow 作为其第一个参数,并将两个表示新窗口尺寸的整数作为其第一个参数

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}  

告诉 GLFW,通过注册它来在每次调整窗口大小时调用此函数

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);  

渲染循环

创建一个 while 循环,称之为渲染循环,它一直运行,直到我们告诉 GLFW 停止,

while(!glfwWindowShouldClose(window))
{glfwSwapBuffers(window);glfwPollEvents();    
}

glfwWindowShouldClose 函数在每次循环迭代开始时检查是否已指示 GLFW 关闭。如果是这样,函数将返回并且渲染循环停止运行,之后我们可以关闭应用程序

glfwSwapBuffers 将交换在此渲染迭代期间用于渲染的颜色缓冲区(一个大型 2D 缓冲区,其中包含 GLFW 窗口中每个像素的颜色值),并将其显示为输出到屏幕

双缓冲区

当应用程序在单个缓冲区中绘制时,生成的图像可能会显示闪烁问题。这是因为生成的输出图像不是瞬间绘制的,而是逐像素绘制的,通常从左到右和从上到下绘制。

由于此图像在呈现时不会立即显示给用户,因此结果可能包含伪影。为了规避这些问题,窗口化应用程序应用双缓冲区进行渲染。

前端缓冲区包含屏幕上显示的最终输出图像,而所有渲染命令都绘制到后端缓冲区。

一旦所有渲染命令都完成,我们就会将后面的缓冲区交换到前面的缓冲区,这样就可以显示图像,而不必仍然渲染到其中,从而删除了所有上述伪影。

glfwPollEvents 函数检查是否触发了任何事件(如键盘输入或鼠标移动事件),更新窗口状态,并调用相应的函数(我们可以通过回调方法注册)

一旦我们退出渲染循环,我们希望正确地清理/删除所有已分配的 GLFW 资源。我们可以通过在主函数末尾调用的 glfwTerminate 函数来做到这一点

glfwTerminate();
return 0;

编译运行

如果一切顺利,那么运行程序我们会看到一个黑色窗口

如果不行,请看全部源代码分析

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include<iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}
int main() {glfwInit();  // 初始化窗口glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 指定创建的内容必须兼容的客户端 API 版本glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 指定创建的内容必须兼容的客户端 API 版本glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 指定要为其创建内容的 OpenGL 配置文件//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 指定 OpenGL 上下文是否应向前兼容GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 注册窗口调整调用函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}while(!glfwWindowShouldClose(window)){glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();return 0;
}

如果想换个颜色的话,可以使用 glClearColor 指定要清除屏幕的颜色,每当我们调用 glClear 并清除颜色缓冲区时,整个颜色缓冲区都将填充 glClearColor 配置的颜色,其中颜色的选项是rgb和透明度四个通道参数

    glClearColor(0.0f,0.5f,0.5f,1.0f);while(!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT);glfwSwapBuffers(window);glfwPollEvents();}glfwTerminate();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模-基于集成学习的共享单车异常检测的研究

基于集成学习的共享单车异常检测的研究 整体求解过程概述(摘要) 近年来&#xff0c;共享单车的快速发展在方便了人们出行的同时&#xff0c;也对城市交通产生了一定的负面影响&#xff0c;其主要原因为单车资源配置的不合理。本文通过建立单车租赁数量的预测模型和异常检测模型…

深入理解URL、URI和URN在Web开发中的重要性

引言&#xff1a; 在Web开发中&#xff0c;我们经常听到URL、URI和URN这几个术语&#xff0c;它们是构建和理解互联网资源的基础。虽然它们看起来相似&#xff0c;但实际上代表着不同的概念。本文将深入研究URL、URI和URN的定义、用途以及在Web开发中的重要性。 一、什么是URI&…

成为AI产品经理——模型稳定性评估(PSI)

一、PSI作用 稳定性是指模型性能的稳定程度。 上线前需要进行模型的稳定性评估&#xff0c;是否达到上线标准。 上线后需要进行模型的稳定性的观测&#xff0c;判断模型是否需要迭代。 稳定度指标(population stability index ,PSI)。通过PSI指标&#xff0c;我们可以获得不…

了解 ignore_above 参数对 Elasticsearch 中磁盘使用的影响

在 Elasticsearch 中&#xff0c;ignore_above 参数允许你忽略&#xff08;而不是索引&#xff09;长于指定长度的字符串。 这对于限制字段的大小以避免性能问题很有用。 在本文中&#xff0c;我们将探讨 “ignore_above” 参数如何影响 Elasticsearch 中字段的大小&#xff0c…

使用git出现的问题

保证 首先保证自己的git已经下载 其次保证自己的gitee账号已经安装并且已经生成ssh公钥 保证自己要push的代码在要上传的文件夹内并且配置文件等都在父文件夹&#xff08;也就是文件没有套着文件&#xff09; 问题 1 $ git push origin master gitgitee.com: Permission de…

2023.11.27 关于 Mybatis 增删改操作

目录 引言 增加用户操作 删除用户操作 修改用户操作 阅读下述文章之间 建议点击下方链接先了解 MyBatis 的创建与使用 MyBatis 的创建与使用 建议点击下方链接先了解 单元测试 的创建与使用 Spring Boot 单元测试的创建与使用 引言 为了方便下文实现增、删、改操作我们先…

Hdoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

MySQL笔记-第04章_运算符

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第04章_运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展&#xff1a;使用正则表达式查询 第04章_运算符 …

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(3)》(19)

《Linux操作系统原理分析之linux存储管理&#xff08;3&#xff09;》&#xff08;19&#xff09; 6 Linux存储管理6.4 Linux 的分段和分页结构6.4.1Linux 的分段结构6.4.2 Linux 的三级分页结构6.4.3 内核页表和进程页表 6 Linux存储管理 6.4 Linux 的分段和分页结构 本节主…

广州数字孪生赋能工业制造,加速推进制造业数字化转型

广州数字孪生赋能工业制造&#xff0c;加速推进制造业数字化转型。数字孪生系统基于历史数据、实时数据&#xff0c;采用人工智能、大数据分析等新一代信息技术对物理实体的组成、特征、功能和性能进行数字化定义和建模。通过构建在信息世界对物理实体的等价映射&#xff0c;对…

【上海大学数字逻辑实验报告】四、组合电路(三)

一、 实验目的 掌握多路选择器74LS151的原理。掌握译码器74LS138的原理。学会在Quartus II上使用多路选择74LS151设计电路。学会在Quartus II上使用译码器74LS138设计电路。 二、 实验原理 多路选择器又称数据选择器或多路开关&#xff0c;它是一种多路输入单路输出的组合逻…

Vue中 实现自定义指令(directive)及应用场景

一、Vue2 1. 指令钩子函数 一个指令定义对象可以提供如下几个钩子函数 (均为可选)&#xff1a; bind 只调用一次&#xff0c;指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted 被绑定元素插入父节点时调用 (仅保证父节点存在&#xff0c;但不一定已…

分享70个节日PPT,总有一款适合您

分享70个节日PPT&#xff0c;总有一款适合您 70个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1IRIKuFoGjQJ14OVkeW_mDQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

使用Python Flask搭建Web问答应用程序并发布到公网远程访问

使用Python Flask搭建web问答应用程序框架&#xff0c;并发布到公网上访问 文章目录 使用Python Flask搭建web问答应用程序框架&#xff0c;并发布到公网上访问前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程…

无人机覆盖路径规划综述

摘要&#xff1a;覆盖路径规划包括找到覆盖某个目标区域的每个点的路线。近年来&#xff0c;无人机已被应用于涉及地形覆盖的多个应用领域&#xff0c;如监视、智能农业、摄影测量、灾害管理、民事安全和野火跟踪等。本文旨在探索和分析文献中与覆盖路径规划问题中使用的不同方…

Linux--网络编程-ftp(TCP)网络通信-文件交互

项目要求&#xff1a;实现以下内容 远程控制&#xff1a; 1、查看服务器当前路径文件 ls 3、进入、退出服务器文件夹 cd 4、上传文件到服务器 put xxx 本地控制&#xff1a; 1、查看本地&#xff08;客户端&#xff09;文件 lls 2、进入客户端文件夹 lcd 3、获取服务器的文件…

智能联动第三方告警中心,完美实现故障响应全闭环

前言 我们曾讨论完善的告警策略是整个数据监控系统的重要组成部分&#xff08;参见《机智的告警策略&#xff0c;完善监控系统的重要一环》&#xff09;&#xff0c;介绍了如何配置告警通知以及场景示例&#xff0c;帮助用户及时更多潜在的故障和问题&#xff0c;有效地保障系…

Word 在页眉或页脚中设置背景颜色

目录预览 一、问题描述二、解决方案三、参考链接 一、问题描述 如何在word的页眉页脚中设置背景色&#xff1f; 二、解决方案 打开 Word 文档并进入页眉或页脚视图。在 Word 2016 及更高版本中&#xff0c;你可以通过在“插入”选项卡中单击“页眉”或“页脚”按钮来进入或者…

C++学习之路(十八)C++ 用Qt5实现一个工具箱(点击按钮以新窗口打开功能面板)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《增加托盘图标并且增加显示和退出菜单》功能。今天我们把按钮打开功能的方式改一改&#xff0c;让点击按钮以新窗口打开功能面板。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&…

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。