【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.hqwc.cn/news/247446.html

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

相关文章

Shopee过期的折扣活动如何删除?Shopee促销商品如何下架?——站斧浏览器

商家们可以轻松删除虾皮过期活动以及下架促销商品&#xff0c;保持店铺的整洁和顾客的购物体验。那么shopee过期的折扣活动如何删除&#xff0c;shopee促销商品如何下架。 Shopee过期的折扣活动如何删除&#xff1f; 在删除虾皮过期活动时&#xff0c;商家们需要遵循以下步骤…

探索图像生成中的生成对抗网络 (GAN) 世界

一、介绍 生成对抗网络&#xff08;GAN&#xff09;的出现标志着人工智能领域的一个重要里程碑&#xff0c;特别是在图像生成领域。GAN 由 Ian Goodfellow 和他的同事于 2014 年提出&#xff0c;代表了机器学习中的一种新颖方法&#xff0c;展示了生成高度逼真和多样化图像的能…

QT使用SQLite(打开db数据库以及对数据库进行增删改查)

QTSQLite 在QT中使用sqlite数据库&#xff0c;有多种使用方法&#xff0c;在这里我只提供几种简单&#xff0c;代码简短的方法&#xff0c;包括一些特殊字符处理。 用SQlite建立一个简单学生管理数据库 数据库中有两个表一个是class和student。 class表结构 student表结果…

python flask Jinja2模板学习

分类很好的一篇文章 Jinja2模板语法 Jinja2里常见的三种定界符&#xff1a; (1) 语句 {% ... %}(2) 表达式 {{ ... }}(3) 注释 {# ... #} {%set adazhaung%} 语句设置变量{{a}} 表达式{% if 2>1 %}控制语句以{%endif%}结尾 Jinja2支持使用“.”获取变量的属…

RflySim | 姿态控制器设计实验一

姿态控制器设计实验1 一. 姿态控制设计简介 本文是建立在多旋翼的姿态即控制器中的反馈信号能够被较好地估计的前提下&#xff0c;控制器中的反馈信号是估计值。不过&#xff0c;为了更加简便根据分离原理&#xff0c;我们用真值代替反馈信号。本文的目的是让多旋翼的姿态能够…

线性规划问题

线性规划问题&#xff1a; 将约束条件及目标函数都是决策变量的线性函数的规划问题称为线性规划问题 一般线性规划问题的描述&#xff1a; 为了解决这类问题&#xff0c;首先需要确定问题的决策变量:然后确定问题的目标&#xff0c;并将目标表示为决策变量的线性函数;最后找出问…

FL Studio 21.2.1.3859中文破解版及FL Studio怎么录制

FL Studio 21.2.1.3859中文破解版是一个数字音频工作站 (DAW)。该软件借助各种编辑工具、插件和效果&#xff0c;让您可以录制、混音和掌握高度复杂的音乐作品。FL Studio 21还允许您注册和编辑 MIDI 文件&#xff0c;您可以在众多可用乐器之一上演奏这些文件。FL Studio 拥有 …

如何安装Wnmp并结合内网穿透实现外网远程访问内网服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

从零开始学习 JS APL(五):完整指南和实例解析

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习内容&#xff1a; Window对象&#xff1a; 定时器-延时函数&#xff1a; JS 执行机制&#xff1a; location对象&#xff1a; 本地存储&#xff1a; 本地存储分类- localStorage&#xff1a…

【latex笔记】双栏格式下插入单栏、双栏格式图片

双栏格式下插入单栏、双栏格式图片 1.缘起multicols2.双栏格式 插入单栏图片3.双栏格式 插入双栏图片 1.缘起multicols 插入双栏格式图片问题被困扰了有很长一段时间&#xff0c;查看网络资源也一直没找到解决方法&#xff0c;今天查看Latex官方文档&#xff0c;才发现因为mul…

【算法专题】前缀和

前缀和 前缀和1. 前缀和【模板】2. 二维前缀和【模板】3. 寻找数组的中心下标4. 除自身以外数组的乘积5. 和为K的子数组6. 和可被K整除的子数组7. 连续数组8. 矩阵区域和 前缀和 1. 前缀和【模板】 题目链接 -> Nowcoder -DP34.前缀和【模板】 Nowcoder -DP34.前缀和【模…

单片机系统

我们来看单片机 的例子&#xff0c;读者可能会担心单片机&#xff08;又称MCU&#xff0c;或微控制器&#xff09; 过于专业而无法理解。完全没必要&#xff01;在这里我们仅借它谈论一下有关时间的话题&#xff0c;顺带提一下单片机系统的概念。 单片机顾名思义是集成到一个芯…