使用glew和glad 新建窗口

一、添加头文件

首先,将头文件加到项目的.cpp文件中

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

注:

包含glad的头文件一定要在包含glfw的头文件之前使用。因为glad的头文件包含了正确的openGL头文件(例如GL/gl.h),所以需要在需要依赖于openGL的头文件之前使用glad.

二、创建main函数

在main函数中实例化GLFW窗口

int main() {
glfwInit();//调用glfwInit函数来初始化GLFW

// 配置GLFW--告诉GLFW使用OpenGL版本为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//告诉GLFW使用的是核心模式(CORE_PROFILE)
return 0;
}

使用glfwWindowHint函数来配置GLFW。

glfwWindowHint函数的第一个参数代表选项的名称,第二个参数接受一个整形,用来设置这个选项的值。

三、创建窗口对象

这个窗口对象存放了所有和窗口相关的数据,而且会被GLFW的其他函数频繁的用到。

1 GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
2 if (window == NULL) {
3     cout << "Failed to creat GLFW window" << endl;
4     glfwTerminate();
5     return -1;
6 }
7 glfwMakeContextCurrent(window);

glfwCreateWindow函数需要窗口的宽和高作为它的前两个参数。第三个参数表示这个窗口的名称。这个函数将会返回一个GLFWwindow对象,我们会在其它的GLFW操作中使用到。创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了。

四、初始化GLAD

GLAD用来管理OpenGL函数的指针,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。

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

我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是glfwGetProcAddress

五、视口

在开始渲染图形之前我们需要告诉OpenGL渲染窗口的尺寸大小,即视口(viewport),这样OpenGL才知道怎样根据窗口大小显示数据和坐标。

glViewPort()将标准化坐标系转换到屏幕坐标系

当窗口大小改变时,视口也被调整。可以对窗口注册一个回调函数(callback function),它会在每次窗口大小被调整的时候被调用。这个回调函数的原型为:

帧缓冲大小函数

void frambuffer_size_callback(GLFWwindow* window,int width,int height)

每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。

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

我们还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的的时候调用这个函数:

glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)

虽然是当窗口大小改变的时候调用这个函数,但是在第一次显示窗口的时候也会调用这个函数。

六、准备好引擎

我们不希望只绘制一个图像之后我们的应用程序就立即退出并关闭窗口。我们希望程序在我们主动关闭之前不断绘制图像并能够接受用户输入。因此,我们需要在程序中添加一个while循环,我们可以称之为渲染循环(render loop),它能在我们让glfw退出前一直保持运行。

下边是一个简单的渲染循环:

1 while(!glfwWindowShouldClose(window))
2 {
3     glfwSwapBuffers(window);
4     glfwPollEvents();    
5 }

glfwWindowShouldClose:函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是,该函数返回true然后渲染循环便结束了。

glfwPollEvents函数检查有没有出发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态、并调用对应的回调函数。

glfwSwapBuffers函数交换颜色缓冲。

七、输入

在GLFW中实现一些输入控制,可以通过几个输入函数完成。

glfwGetKey函数需要一个窗口及一个按键作为输入,这个函数将会返回这个按键是否正在被按下。我们可以创建一个processInput函数,在其内放置不同的输入函数,让输入代码保持整洁。

1 void processInput(GLFWwindow *window) {
2     if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
3         glfwSetWindowShouldClose(window,true);
4     }
5 }

这里我们检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法关闭GLFW。下一次while循环的条件检测将会失败,程序将会关闭。

并添加到while循环中的第一个语句。

八、释放资源

当渲染循环结束后我们需要正确释放/删除之前分配的所有资源。可以在main函数的最后调用glfwTerminate()来完成。

1 glfwTerminate();
2 return 0;

这样便能清理所有的资源并正确的退出应用程序。

代码:NEW.cpp

转载于:https://www.cnblogs.com/keguniang/p/9897420.html

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

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

相关文章

有道词典笔3新增功能扫读和点读是怎么集成的?

2020年12月1日&#xff0c;有道品牌推出了一款硬件新品&#xff0c;名叫有道词典笔3。 相对有道于2019年8月推出后来被称为“爆品”的有道词典笔2来说&#xff0c;有道3硬件最大最明显差别是屏幕变的更大了&#xff0c;同时增加了点读功能&#xff08;点读笔点读特定教材的功能…

RTP协议分析

RTP协议分析 一&#xff0e; RTP协议背景.......................................................................................................... 1 二&#xff0e; RTP协议原理及工作机制........................................................................…

mongodb 部署

安装mongodb-3.4 1&#xff09;将安装包上传至服务器 2&#xff09;对压缩文件进行解压 tar -zxvf mongodb-linux-x86_64-suse12-v3.4-latest.tar.gz 3&#xff09;把解压出来的文件修改一下名字&#xff0c;并挪到指定安装路径 sudo mv mongodb-linux-x86_64-suse12-3.4.6-22-…

如何选择一款优秀的儿童读写台灯?

如何选择一款优秀的儿童阅读台灯&#xff1f;除了品牌、外观、材质、价格等因素外&#xff0c;最关键的是技术参数。 先说结论&#xff0c;满足如下几点参数&#xff0c;当数优选&#xff1a; 1-光通量&#xff1a;500lm以上 2-显色指数&#xff1a;≥95 3-色温&#xff1a…

Python与操作系统有关的模块

Os模块Python的标准库中的os模块主要涉及普遍的操作系统功能。可以在Linux和Windows下运行&#xff0c;与平台无关。os.sep 可以取代操作系统特定的路径分割符。os.name字符串指示你正在使用的平台。比如对于Windows&#xff0c;它是’nt’&#xff0c;而对于Linux/Unix用户&am…

数据对拍代码 c++

码了一晚上才码出这个&#xff0c;有点简陋&#xff0c;待更新 注意&#xff1a;1、数据路径自己在代码中修改&#xff0c;直接重定向即可 2、要配置好环境&#xff0c;将cb安装路径里的MinGW\bin路径放到path中 3、三份代码记得先编译一遍&#xff0c;再运行这份代码 #include…

LCD显示相关知识

无论是笔记本电脑还是桌面系统&#xff0c;采用的LCD显示屏都是由不同部分组成的分层结构。位于最后面的一层是由荧光物质组成的可以发射光线的背光层。背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层。液晶层中的水晶液滴都被包含在细小的单元格…

屏幕防蓝光设计方向

屏幕防蓝光设计方向&#xff0c;会有哪些呢&#xff1f; 初步想到的如下&#xff1a; 1- 背光灯珠类型&#xff1b; 蓝光激发还是全光谱sunlike灯珠&#xff1b; 2-玻璃镀膜&#xff1b; 3-屏幕贴膜&#xff1b; 4-软件设置&#xff1b; 除了第一项外&#xff0c;其余均多…

快速幂,矩阵乘法,矩阵快速幂

快速幂利用二进制 复杂度 log级 #include <cstdio> #include <iostream> #include <string> #include <bits/stdc.h>using namespace std; typedef long long ll; typedef unsigned long long ull;int q_power(int a,int b,int c) {int r1;a%c;while (…

标准C++类std::string的内存共享和Copy-On-Write(写时拷贝)

标准C&#xff0b;&#xff0b;类std::string的内存共享&#xff0c;值得体会&#xff1a; 详见大牛&#xff1a;https://www.douban.com/group/topic/19621165/ 顾名思义&#xff0c;内存共享&#xff0c;就是两个乃至更多的对象&#xff0c;共同使用一块内存&#xff1b; 1.关…

常用类一一枚举类一一定义和调用

package test;public class EnumTest {/**枚举* */public static void main(String[] args) {// TODO Auto-generated method stubStudent stu new Student();stu.setName("李华");stu.setSex(Genders.MALE);stu.setAge(24);System.out.println(stu.getSex());}} pa…

HDbaseT 高清传输更简单——只需一根网线

HDbaseT支持最高20Gbps的传输速率&#xff0c;能更好的支持未来的3D和2K4K视频格式&#xff0c;传输采用普通的CAT5e/6网络线缆&#xff0c;连接器也采用普通的 RJ45接头&#xff0c;而传输距离达到了100米&#xff0c;除了提供视频信号传输功能外&#xff0c;还具有网络连接以…

2017年

2017年对自己来说这一年是最需要成长的一年&#xff0c;肩上的责任越来越大了。转载于:https://www.cnblogs.com/jimmy1293/p/6543533.html

解决 | 此数据库文件跟当前sql server实例不兼容 sql server2008无法连接到(local)...

最近在搞ASP.NET&#xff0c;因实验室VS版本跟PC不一样可能&#xff0c;拷回来一打开就这样子&#xff1a; 眉头一皱的我打开我的古董SQL&#xff0c;自从用了MySQL就没碰它了我的锅。。。果然。。连接的时候。。。不慌&#xff0c;(win 10)打开控制面板\系统和安全\管理工具 -…

IP大时代下,网络枪机技术发展现状

来源&#xff1a;a&s《评测&选型》 作者&#xff1a;海康威视程玮 在视频监控行业内&#xff0c;有很多里程碑式的产品&#xff0c;我们可以从这些产品中了解视频监控的发展趋势。2000年左右&#xff0c;第一台DVR面世奠定了视频监控行业从CCTV走向数字化的基础&#x…

JVM调优总结(3):垃圾回收面临的问题

如何区分垃圾 上面说到的“引用计数”法&#xff0c;通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以&#xff0c;后来实现的垃圾判断算法中&#xff0c;都是从程序运行的根节点出发&#xff0c;遍历…

RoHS、无铅制程、无卤 的基本介绍

一、RoHS是欧盟对电子电器产品不能超标含有某些有害物质的禁令&#xff1b;在具体产品生产中&#xff0c;从原材料的选择、采购到制程中可能会污染产品&#xff08;和产品接触&#xff09;的生产辅助材料&#xff0c;都必须不能超标含有&#xff08;有最大允许浓度&#xff09;…

springCloud分布式事务实战(九)改造ThemeMicroService 支持分布式事务

&#xff08;1&#xff09; 添加jar <!-- springCloud 事务 关键点1 --><dependency><groupId>com.codingapi</groupId><artifactId>transaction-springcloud</artifactId><version>${lcn.last.version}</version><exclu…

日常的一天学习

今天的学习仍然没有特别明确的计划&#xff0c;也许自己不应该再徘徊&#xff0c;专心做java编程挺好的啊&#xff0c;也许还能找到不错的工作&#xff0c;可是自己始终还是想成为一个研究安全的人&#xff0c;只是不知道自己在毕业的时候能不能成长到靠安全来养活自己。 早上主…

庖丁解牛-----Live555源码彻底解密(根据MediaServer讲解Rtsp的建立过程)

live555MediaServer.cpp服务端源码讲解(testRelay.cpp,http://blog.csdn.net/smilestone_322/article/details/18923139) int main(int argc, char** argv) { // Begin by setting up our usage environment: TaskScheduler* scheduler BasicTaskScheduler::createNew(); Usa…