一、添加头文件

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

 #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的其他函数频繁的用到。

 GLFWwindow* window = glfwCreateWindow(, , "LearnOpenGL", NULL, NULL);
if (window == NULL) {
cout << "Failed to creat GLFW window" << endl;
glfwTerminate();
return -;
}
glfwMakeContextCurrent(window);

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

四、初始化GLAD

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

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

我们给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(,,width,height);
}

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

glfwSetFramebufferSizeCallback(window,framebuffer_size_callback)

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

六、准备好引擎

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

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

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

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

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

glfwSwapBuffers函数交换颜色缓冲。

七、输入

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

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

 void processInput(GLFWwindow *window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window,true);
}
}

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

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

八、释放资源

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

1 glfwTerminate();
2 return 0;

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

代码:NEW.cpp

使用glew和glad 新建窗口的更多相关文章

  1. Tkinter关于新建窗口内Entry无法获取值(值全为空)的解决办法

    最近在做Python的课程作业,遇到一个问题,描述如下: 使用Python内置的Tkinter模块进行GUI编程 给一个按钮(或菜单)绑定事件,打开一个新窗口,新窗口内有Entry若干,通过textv ...

  2. [AIR] 新建窗口的方法

    有时根据需要,我们需要在AIR程序中开多个窗口window 以下新建一个窗口: var opion:NativeWindowInitOptions = new NativeWindowInitOpti ...

  3. 用extjs6.0写一个点击新建窗口的功能

    一.写一个按钮 注意id { id: 'ListEdit', text:'编辑', iconCls:'x-fa fa-edit' } 二.写新建的页面 下面我新建的是表单,有几点需要注意的: ① 因为 ...

  4. AWT 新建窗口

    新建一个窗口 包 import java.awt.*; 定义 Frame frm_Draw = new Frame("Text"); 初始化代码 public void Frame ...

  5. Dynamics CRM - 利用 JavaScript 打开指定 entity 的新建窗口并传递需要的参数

    由于业务逻辑需要,需要从某个 Entity 的 Record 中弹出其他 Entity 的创建窗口,并将当前 Entity 中的某些值传递到新打开的窗口中,具体的 JS 代码如下: //定义一个参数对 ...

  6. Qt 释放新建窗口资源

    当Widget *w = new Widget(); 不方便调用 delete w;时 Widget *w = new Widget(); w->setAttribute(Qt::WA_Dele ...

  7. opencv打开摄像头并新建窗口显示

    几个程序使用的基本函数如下: ******************************************************************* cvCreateCameraCap ...

  8. screen新建窗口,环境变量跟原来不一致。

    昨天为了方便npm安装全局包,我把环境变量重新配置了. 然后,在项目中引用全局包没有出问题.但是后来我在screen里面引用全局包,报错说找不到. 使用#npm list -g命令 发现昨天的全局包都 ...

  9. eas之新建窗口

    public void actionObjectProp_actionPerformed(ActionEvent e)          throws Exception {     UIContex ...

随机推荐

  1. jdbcType="DATE"和jdbcType=" TIMESTAMP"的区别

    原文: https://www.cnblogs.com/fswhq/p/jdbcType.html 当传入null值时,jdbcType 会防止null空指针异常报错 Mybatis 中jdbcTyp ...

  2. 1450:【例 3】Knight Moves

    1450:[例 3]Knight Moves  题解 这道题可以用双向宽度搜索优化(总介绍在  BFS ) 给定了起始状态和结束状态,求最少步数,显然是用BFS,为了节省时间,选择双向BFS. 双向B ...

  3. mysql添加字段索引失败 BLOB/TEXT column 'col2' used in key specification without a key length

    看了下该表的数据结构发现col2字段类型是text ,查询了下发现是:MySQL只能将BLOB/TEXT类型字段设置索引为BLOB/TEXT数据的钱N个字符.索引指定下col2的长度就可以了 : al ...

  4. c++实验7 二叉树

    二叉树数据结构表示及基本操作算法实现 1.所加载的库函数或常量定义及类的定义: #include<stdlib.h> #include<stdio.h> #include&qu ...

  5. lua源码学习篇二:语法分析

    一步步调试,在lparser.c文件中luaY_parser函数是语法分析的重点函数,词法分析也是在这个过程中调用的.在这个过程中,用到一些数据结构,下面会详细说. Proto *luaY_parse ...

  6. Linux_NFS/Samba服务器

    目录 目录 网络共享的解决方案 搭建NFS服务 服务器端19216801 客户端19216802 autofs自动挂载nfs共享 搭建Samba服务 服务器端 客户端 网络共享的解决方案 Linux/ ...

  7. [转]delphi 防止刷新时闪烁的终极解决办法

    { 防止刷新时闪烁的终极解决办法(对付双缓冲无效时) }Perform($000B, 0, 0); //锁屏幕 防止闪烁 // 做一些会发生严重闪烁的事情.. //解锁屏幕并重画Perform($00 ...

  8. 阶段3 1.Mybatis_11.Mybatis的缓存_8 mybatis的二级缓存

    二级缓存:             它指的是Mybatis中SqlSessionFactory对象的缓存.由同一个SqlSessionFactory对象创建的SqlSession共享其缓存.      ...

  9. C# 无焦点获取扫码枪扫码信息

    代码网上有的是,多是需要窗体焦点直接show出扫码信息(usb,模拟键盘,hook) 怎样才能真的无焦点获取? 用串口方式 usb转串口 以接收串口通讯消息的方式获取扫码信息

  10. 批处理文件将多台连接的手机安装同一个APP

    :adb devices > C:\Users\aaminaxu\Desktop\a.txt :1.首先获取连接到电脑的手机的设备信息将其保存到C盘的a.txt文件中::2.将保存的txt文件中 ...