【OpenGL学习】OpenGL窗口创建

news2025/1/16 11:00:10

OpenGL窗口创建

本节介绍如何在利用配置好的GLFW和GLAD进行一个简单窗口的绘制,首先明白在OpenGL中进行图形绘制到窗口的整个流程:

  • 初始化GLFW
  • 创建窗口window
  • 创建OpenGL上下文
  • 初始化Glad
  • 渲染循环
  • 结束绘制

初始化GLFW

然后我们从上面的流程逐步进行窗口创建,首先完成GLFW的初始化,代码如下:

	//Init
	//-----------------------------------------------------------------------
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

解释一下上面几行代码的含义,首先glfwInit()完成对GLFW的初始化,接着我们对Hint进行指定,因为使用的是OpenGL3.3,所以主版本号GLFW_CONTEXT_VERSION_MAJOR和副版本号GLFW_CONTEXT_VERSION_MINOR均设置为3,OPenGL的模式设置为GLFW_OPENGL_CORE_PROFILE,核心模式,关于核心模式见OpenGL介绍那节。完成上述操作之后,GLFW窗口的初始化就成功了。

创建窗口

使用函数glfwCreateWindow来创建一个GLFWwindow指针,持有我们创建的窗口,在函数中对窗口的各种属性进行指定,分别为窗口的宽和高,窗口的标题,以及后面两个GLFWmonitor和GLFWwindow的指针,可以设置为nullptr

	// glfw window creation
	// --------------------
	GLFWwindow* window = glfwCreateWindow(800, 600, "OPenGL", nullptr, nullptr);

窗口创建完成之后,确认是否创建成功,如果不成功,则直接退出程序:

	if (window == nullptr)
	{
		std::cout << "Failed to create window!" << std::endl;
		glfwTerminate();
		return -1;
	}

创建OpenGL上下文

创建openGL上下文主要是通过这个函数glfwMakeContextCurrent(window),传入的参数为我们创建好的窗口指针,这行代码执行完毕之后上下文就创建好了。

初始化Glad

Glad的初始化如下:

	// glad: load all OpenGL function pointers
	// ---------------------------------------
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Glad Initialized failed!" << std::endl;
		return -1;
	}

渲染循环

一切准备完毕之后就可以进行渲染了,也就是我们熟悉的 Render Loop:

	while(!glfwWindowShouldClose(window))
	{

		glClearColor(0.2f, 0.8f, 0.5f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

在没有点击关闭窗口的按钮前,会一直运行函数体内的内容,这里我放了一个清空颜色缓冲区的函数,每次执行循环的时候,都会用glClearColor()指定的颜色来进行清空,最终窗口显示的颜色就是指定颜色,函数glClear()是当前缓冲区使用什么内容清空的,一般有:

        GL_COLOR_BUFFER_BIT;   //表示清除当前可写的颜色缓冲
        GL_DEPTH_BUFFER_BIT:   // 深度缓冲
        GL_ACCUM_BUFFER_BIT:  // 累积缓冲
        GL_STENCIL_BUFFER_BIT : //模板缓冲

函数glfwSwapBuffers(window)会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),和当前显示在屏幕上面的缓冲进行交换,避免绘制的过程显示在屏幕上,可以参阅双缓冲这篇文章:双缓冲技术讲解_海洋_的博客-CSDN博客_双缓冲。

之后通过函数glfwPollEvents()将触发事件上传,比如各种输入等,事件系统可以参考unity手册中的描述:事件系统 - Unity 手册 (unity3d.com)。

渲染中的窗口如下:
在这里插入图片描述

结束绘制

绘制完成之后,结束程序,终止GLFW运行:

	// glfw: terminate, clearing all previously allocated GLFW resources.
   // ------------------------------------------------------------------
	glfwTerminate();

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

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

相关文章

知微传感3D相机SDK开发文档一查找相机

知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍&#xff0c;大家一个界面显示程序包含图像的获得&#xff0c;相机的查找和链接 查找相机&#xff0c;通过UDP广播形式查找局域网相机链接相机&#xff0c;通过IP地址链接局域网内的相机获取图片&…

如何提升计算机的运行速度-正确清理C盘的方法

本文是向大家介绍清理C盘的方法&#xff0c;它能够实现给系统盘瘦身&#xff0c;能够带来提升计算机运行速度价值。提升计算机的运行速度-清理C盘的方法1 利用Windows附带的磁盘清理工具鼠标右击【C盘】选择【属性】选择【磁盘清理】勾选需要清理的文件&#xff0c;点击【确定】…

2023 hgame --- week1 wp

文章目录Miscsign ine99p1ant_want_girlfriend神秘的海报Where am IWebClassic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyCryptoRSABe Stream神秘的电话兔兔的车票Retest_your_IDAeasyasmencodeeasyenca_cup_of_teaPwntest_nciotHelp the uncle who can…

【阶段三】Python机器学习29篇:机器学习项目实战:DBSCAN算法的基本原理与DBCSAN新闻聚类分群模型

本篇的思维导图: DBSCAN模型 DBSCAN(全称为Density-Based Spatial Clustering of Applications with Noise)是一种以密度为基础的空间聚类算法,可以用密度的概念剔除不属于任一类别的噪声点。该算法将簇定义为密度相连的点的最大集合,将具有足够密度的区域划分为…

rabbitmq命令大全

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录服务管理启动服务后台启动查看状态用户管理新增账号删除用户所有用户:修改密码:清除密码角色管理设…

MinIO安装总结

概述 初学者安装MinIO还是会遇到很多坑的&#xff0c;这里做个总结&#xff0c;希望能够大家可以快速的搭建MinIO环境&#xff0c;可以更好的快速入门。 linux下手动安装(不推荐) cd /opt/testMinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x…

spark Shuffle

Spark Shuffle的演进及SortShuffle的基本思想 1. 演进 HashShuffle -> HashShuffle 的Consolidate机制 -> SortBasedShuffle -> Tungsten-sort Based Shuffle 2. 各种 Shuffle的介绍 2.1 HashShuffle Spark 之所以一开始就提供基于 Hash 的 Shuffle 实现机制&…

高级驾驶辅助系统(ADAS)——自适应巡航控制系统

一、定速巡航——L1级别 定速巡航系统&#xff08;CCS&#xff1a;Cruise Control&#xff09;&#xff1a;驾驶员设定目标车速&#xff08;手动加速或减速&#xff09;&#xff0c;不能根据实际路况对车辆的行驶状态进行调节或者给予必要的预警提示&#xff0c;缺乏对环境的应…

【信管8.2】建设与管理项目团队

建设与管理项目团队在经过制定人力资源管理计划之后&#xff0c;我们就有了人力资源计划文档&#xff0c;然后通过组建团队也让团队有了正式的成员&#xff0c;接下来要干什么呢&#xff1f;当然就是在项目的开发过程中不断地建设团队和管理团队了。这两个部分的内容也是我们项…

斜方向三消查找算法的原理和实现

本文首发于微信公众号&#xff1a; 小蚂蚁教你做游戏。欢迎关注领取更多学习做游戏的原创教程资料&#xff0c;每天学点儿游戏开发知识。嗨&#xff01;大家好&#xff0c;我是小蚂蚁。上篇文章中我们讲了三消查找算法的原理和实现&#xff0c;在宝石方块中&#xff0c;除了水平…

雅思经验(2)

写作技巧&#xff1a;雅思写作忌讳的就是一边倒&#xff0c;辩论的精华在于驳斥&#xff0c;能够找出对方的漏洞&#xff0c;证明对方的观点和论据是没有道理的&#xff0c;这个点很重要。考官评价&#xff1a;“it does not address all parts of the question,so it loses ma…

【JVM系列】字符串常量池

字符串常量池 概念 字符串常量池是一个大小固定的HashTable&#xff0c;默认长度是1009。java6存放在永久代&#xff0c;java7和java8存放到java堆中。 常见面试题 用双引号定义的字符串是直接存储到常量池&#xff0c;用new String创建的是存放在堆中。 String s1 "1…

BI技巧丨计算Topn品名

BOSS&#xff1a;白茶&#xff0c;问你个事&#xff0c;能不能动态的根据我们的销量&#xff0c;告诉我销量前三的商品有哪些&#xff1f;这样便于我针对商品进行调控。 白茶&#xff1a;Topn问题&#xff1f; BOSS&#xff1a;什么套不套的&#xff0c;我不懂&#xff0c;你就…

深入理解数据结构 —— 并查集

什么是并查集 并查集是一种数据结构&#xff0c;主要能够高效地实现以下两个功能 给出图中任意两点a&#xff0c;b&#xff1a; union(a,b) &#xff1a;将a&#xff0c;b所在的集合合并起来isConnected(a,b) &#xff1a;问这a&#xff0c;b两点能否通过任意路径连接起来 …

防治新冠病毒感染,儿童如何居家备药?

随着新冠疫情防控的优化&#xff0c;如何为家里的孩子准备药物&#xff1f;这是家长们关心的问题。下面由小熊药师一一解惑。儿童新冠病毒感染主要表现为发热.流涕.咳嗽可能伴有呕吐&#xff0c;可能伴有呕吐.腹泻和其他胃肠道反应。症状一般持续2~5天&#xff0c;其中发热一般…

Map和Set的介绍

目录 1、Map 和 Set 的概念 2、模型 3、Map 的学习 3.1 关于 Map.Entry 3.2 Map 的常用方法 4、Set 的常用方法 5、 Map 和 Set 的注意点 1、Map 和 Set 的概念 Java 提供了 Map 和 Set 的接口&#xff0c;是一种专门用来进行搜索的容器或数据结构&#xff0c;而他搜索…

1.3、操作系统的发展和分类

整体框架 1、手工操作阶段 1.1、主要缺点 用户独占全机、人机速度矛盾导致资源利用率极低 一个用户把自己的程序放入纸带机&#xff0c;等待计算机执行完后&#xff0c;用户再取走自己的数据。 这时候&#xff0c;下一个用户才可以继续接着使用该计算机系统 在一个时间段内只…

1.4、操作系统的运行机制和体系结构

整体框架 1、运行机制 1.1、什么是指令 简单来说&#xff0c;“指令” 就是处理器&#xff08;CPU&#xff09;能识别、执行的最基本命令 比如&#xff1a;加法指令就是让 CPU 进行加法运算 1.2、特权指令&非特权指令 新的问题: 有的指令 “人畜无害” 。 比如&#xf…

【NI Multisim 14.0操作实例——最小系统电路】

目录 序言 &#x1f95d;1.设置工作环境 &#x1f95d; 2.设置原理图图纸 &#x1f95d; 3.设置图纸的标题栏 &#x1f95d; 4.增加元件 &#x1f95d; 5.放置电阻 &#x1f95d; 6.放置无极性电容 &#x1f95d; 7. 放置可变电容 &#x1f95d; 8. 放置电感 &#x…

概论_第3章_两个随机变量的函数的分布__卷积公式

前面&#xff0c; 我详细介绍了 一个随机变量函数的概率分布 &#xff0c;本文开始介绍 两个随机变量的函数。注意&#xff0c; 不能写成 两个随机变量函数&#xff0c; 那就会误认为 两个函数&#xff0c;本文主要介绍两个连续型随机变量的函数&#xff0c; 至于离散型&#x…