一、添加头文件

首先,将头文件加到项目的.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. JAVA周二学习总结

    第一周我感觉我学到了不少东西,其中有上学期C语言学的不好的原因,因为不想再挂科就有认真的在听. 学到的东西有JAVA的基本书写模式自己懂了,还在课堂上弄会了交换数据的方法,还有运算的算法,另外还有数据 ...

  2. PM项目跟进护航文档模板

    护航文档 版本需求列表 需求 开发责任人 MMDrawerController.GCDTimer.Speex_armv7s等11个库迁移 熊文杰 相关人员 职称 开发人员 开发 熊文杰 测试 xxx ...

  3. 打造boost的trhead环境

    windows下的环境 1.官网下载boost_1_68_0解压后用VS2010的命令行工具运行bootstrap.bat 2.用VS2005命令行工具运行 bjam.exe link=static ...

  4. Mybaits查询返回值是List类型的

    查询返回值是list类型的 1 首先在接口中写方法 public interface EmployeeMapper { public List<Employee> getEmpsByLas ...

  5. Python深度学习读书笔记-2.初识神经网络

    MNIST 数据集 包含60 000 张训练图像和10 000 张测试图像,由美国国家标准与技术研究院(National Institute of Standards and Technology,即 ...

  6. AJAX向Django后端提交POST请求

    一.ajax登录示例 二.CSRF跨站请求伪造 方式一 方式二 方式三 方式四 一.ajax登录示例 urls.py from django.conf.urls import url from dja ...

  7. hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败

    在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @Resp ...

  8. 阶段3 1.Mybatis_04.自定义Mybatis框架基于注解开发_1 今日课程内容介绍

  9. django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.的解决办法

    如题,这个错误的解决办法如下: 在代码文件的最上方添加以下代码: import os,django os.environ.setdefault("DJANGO_SETTINGS_MODULE ...

  10. Matlab——矩阵运算 矩阵基本变换操作

    矩阵运算 + 加 - 减 .* 乘 ./ 左除 .\ 右除 .^ 次方 .' 转置 除了加减符号,其余的运算符必须加“.” >> a = : a = >> a- %减法 ans ...