opengl 学习(一)-----创建窗口

创建窗口

  • 分类
  • opengl 学习(一)-----创建窗口
  • 效果
  • 解析
  • 教程
  • 补充

分类

c++ opengl

opengl 学习(一)-----创建窗口

  • demo:
#include "glad/glad.h"
#include "glfw3.h"
#include <iostream>
#include <cmath>
#include <vector>using namespace std;//响应窗体大小变化的回调
//参数的意思:哪一个窗口发生了变化:变化后的宽高
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{//std::cout<<"窗口最新大小:"<<width<<","<<height<<std::endl;glViewport(0, 0, width, height);
}//响应键盘的回调函数
void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{//键盘事件响应//key:字母按键码//scancode不用管//action:按下还是抬起//mods:是否有shift或ctrlif (key == GLFW_KEY_Q){std::cout << "按下了:" << key << std::endl;}if (key == GLFW_PRESS){//按键按下}if (key == GLFW_RELEASE){//按键抬起}if (key == GLFW_MOD_CONTROL)//control{//按下ctrl的同时,按下了key}if (key == GLFW_MOD_SHIFT){//按下shift的同时,按下了key}
}void processInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}int main()
{glfwInit();//调用glfwInit函数来初始化GLFW//然后我们可以使用glfwWindowHint函数来配置GLFW//glfwWindowHint函数的第一个参数代表选项的名称,我们可以从很多以GLFW_开头的枚举值中选择;// 第二个参数接受一个整型,用来设置这个选项的值//该函数的所有的选项以及对应的值都可以在下面这篇文档中找到,// 反正我是看不懂,你可以尝试去看一下//https://www.glfw.org/docs/latest/window.html#window_hintsglfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//opengl环境的主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//opengl环境的次版本号glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式//我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。// 明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)//核心模式是3.3之后,之前的是传统模型,是不兼容的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);//设置当前窗口为opengl绘制的舞台,你可以创建很多个窗口//OPengl的专属窗口大小变化回调语法:glfwSetFramebufferSizeCallback//参数的含义:哪个窗体响应的窗体大小glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//OPengl的专属键盘回调语法:glfwSetKeyCallback//参数的含义:哪个窗体响应的键盘事件glfwSetKeyCallback(window, keyCallBack);//在之前的教程中已经提到过,GLAD是用来管理OpenGL的函数指针的,// 所以在调用任何OpenGL的函数之前我们需要初始化GLAD。if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}//while (!glfwWindowShouldClose(window))//glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出//{//    glfwSwapBuffers(window);// glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态//    glfwPollEvents();//glfwSwapBuffers函数会交换颜色缓冲//}// 渲染循环while (!glfwWindowShouldClose(window)){// 输入processInput(window);// 渲染指令glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 检查并调用事件,交换缓冲glfwPollEvents();//接收并分发窗口信息glfwSwapBuffers(window);}glfwTerminate();//用于退出程序return 0;
}

效果

请添加图片描述

解析

程序在进行窗口循环while (!glfwWindowShouldClose(window))
每次一次循环是渲染了一帧
在这里插入图片描述
GLFW其实就是给opengl提供一个窗口

Glad是确定你驱动上opengl上的版本

教程

在此感谢b站大学让我能够解除到这么有意思的图形库

  1. https://www.bilibili.com/video/BV1aK4y1z7ii/?spm_id_from=333.788&vd_source=b0ae72e5d408bb143449717af5dd95af
  2. https://www.bilibili.com/cheese/play/ep211557
  3. https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/

补充

其实上面写太乱了,下面写个简单的

#include "glad/glad.h"
#include "glfw3.h"
#include <iostream>
#include <cmath>
#include <vector>using namespace std;int main()
{//1.初始化GLFW基本环境glfwInit();//1.1设置Opengl主次版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//1.2设置核心渲染模式(非立即渲染模式)glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//2.创建窗体对象GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}//设置当前窗体对象为 OPengl的绘制舞台glfwMakeContextCurrent(window);//3. 执行窗体循环while (!glfwWindowShouldClose(window)){//接收并分发窗体信息//检查消息队里是否有需要处理的鼠标,键盘等消息//如果有的话就进行批量处理,并清空队列glfwPollEvents();}//退出程序前做相关的资源清理glfwTerminate();return 0;
}

请添加图片描述

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

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

相关文章

数据结构与算法-线性查找

引言 在计算机科学领域&#xff0c;数据结构和算法是构建高效软件系统的核心要素。今天我们将聚焦于最基础且广泛应用的一种查找算法——线性查找&#xff0c;并探讨其原理、实现步骤以及实际应用场景。 一、什么是线性查找&#xff1f; 线性查找&#xff08;Linear Search&am…

QT6.6 android开发环境搭建

一.目标 本文目的为实现在QT6.6下搭建android开发环境&#xff0c;可以实现QT6.6开发的QT程序&#xff08;widget及qml工程&#xff09;部署到android设备中。 二.环境安装 1.QT6.6环境安装 &#xff08;1&#xff09;在线安装器下载&#xff1a; https://download.qt.io/a…

c++单例九品

c单例九品 单例实现第一品单例实现第二品单例实现第三品单例实现第四品单例实现第五品单例实现第六品单例实现第七品单例实现第八品单例实现第九品 该专栏用于记录C中的单例模式&#xff0c;通过九种单例的实现方式&#xff0c;从代码安全和性能角度来分析、学习和品鉴实现优劣…

redis最新版本在Windows系统上的安装

一、说明 这次安装操作主要是根据redis官网说明&#xff0c;一步步安装下来的&#xff0c;英语比较好的同学&#xff0c;可以直接看文章底部的超链接1&#xff0c;跳到官网按步操作即可。 目前redis的最新稳定版本为redis7.2。 二、Windows环境改造 Redis在Windows上不被官方…

实战:循环神经网络与文本内容情感分类

在传统的神经网络模型中&#xff0c;是从输入层到隐含层再到输出层&#xff0c;层与层之间是全连接的&#xff0c;每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能为力。例如&#xff0c;你要预测句子的下一个单词是什么&#xff0c;一般需要用到前面的单…

已解决CircuitBreakerOpenException断路器打开异常的正确解决方法,亲测有效!!!

已解决CircuitBreakerOpenException断路器打开异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 在微服务架构中&#xff0c;为了提高系统的可用性和稳定性&#xff0c;通常会使用…

【前端】尚硅谷Promise

文章目录 【前端目录贴】

Python3统计json格式文件中各个key对应值出现的频次

需求&#xff1a; 现在有一个文件query_demo.json&#xff0c;里面的数据格式示例如下&#xff0c;query字段代表的是用户的提问&#xff0c;现在想统计所有不同query出现的频次。 [{"query": "会议开始提醒弹窗如何开启","intention": "…

Elemenu中el-table中使用el-popover选中关闭无效解决办法

主要是技术太菜,没找到原因,一点点才找到这个办法解决 因为在el-table-column里,因为是多行,使用trigger"manual" 时,用v-model"visible"来控制时,控件找不到这个值,才换成trigger"click" 先找到弹出关闭事件,再找元素的属性 右键>审核元素…

JS算法总结

1 找出字符串的可整除数组 一个整数可表示为 a10b&#xff1b; 常用取模公式&#xff1a;(a10b)%m(a%m10b)%m 由上式可得&#xff1a;当前字符串所代表的数字&#xff0c;能否被 m 整除。等价于前一个字符串与 m 的余数当前数字的和&#xff0c;这个和能否被 m 整除。 例如&…

关于比特币的AI对话

【ChatGPT】 比特币源码开源吗&#xff1f; 是的&#xff0c;比特币的源码是开源的。比特币项目是在MIT许可证下发布的&#xff0c;这意味着任何人都可以查看、修改、贡献和分发代码。比特币的源码托管在GitHub上&#xff0c;可以通过下面的链接进行访问&#xff1a; https://g…

【深度优先】【图论】【C++算法】2045. 到达目的地的第二短时间

作者推荐 视频算法专题 LeetCode2045. 到达目的地的第二短时间 城市用一个 双向连通 图表示&#xff0c;图中有 n 个节点&#xff0c;从 1 到 n 编号&#xff08;包含 1 和 n&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中每个 edges[i] [ui, vi] 表…

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中&#xff0c;给我们提供了以下几种连接网络的模式 桥接模式&#xff1a;直接联机物理网络NAT模式&#xff1a;用于共享主机的IP地址仅主机模式&#xff1a;与主机共享的专用网络自定义&#xff1a;特定虚拟网络LAN区段 特别注意的是&am…

【计算机系统】2.进程管理

【计算机系统】2.进程管理 这个章节十分的重要&#xff0c;作业也要好好做&#xff0c;因为我学的是后端&#xff0c;学计算机进程的处理对于搞并发来说十分有用。 提出问题 6、试从动态性、并发性和独立性上比较进程和程序。19、为什么要在OS中引入线程?A.请用信号量解决以下…

Unity3D 实现大世界地图的技术原理详解

前言 Unity3D是一款非常强大的游戏引擎&#xff0c;可以用于创建各种类型的游戏&#xff0c;包括大世界地图。在这篇文章中&#xff0c;我们将详细介绍如何使用Unity3D实现大世界地图&#xff0c;并给出相应的技术原理和代码实现。 对惹&#xff0c;这里有一个游戏开发交流小…

代码随想录Day23 | Leetcode93 复原 IP 地址、Leetcode78 子集 | Leetcode90 子集II

上题 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 90. 子集 II - 力扣&#xff08;LeetCode&#xff09; 第一题 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不…

Linux每日练习

第一部分 1.打开桌面的主文件夹&#xff0c;在图片文件夹下新建一个名为111的文件夹&#xff0c;在视频文件夹下创建一个名为222的文件夹 [rootxcz7 desk]# mkdir -p ./pic/111 [rootxcz7 desk]# mkdir -p ./video/2222.在桌面打开终端&#xff0c;先切换到根目录下&#xff…

NineData与OceanBase完成产品兼容认证,共筑企业级数据库新生态

近日&#xff0c;云原生智能数据管理平台 NineData 和北京奥星贝斯科技有限公司的 OceanBase 数据库完成产品兼容互认证。经过严格的联合测试&#xff0c;双方软件完全相互兼容、功能完善、整体运行稳定且性能表现优异。 此次 NineData 与 OceanBase 完成产品兼容认证&#xf…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 传统布局和Web标准布局的区别

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 传统布局与…

【机器学习】包裹式特征选择之基于遗传算法的特征选择

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…