使用glew和glad 新建窗口

Posted keguniang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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函数交换颜色缓冲。







以上是关于使用glew和glad 新建窗口的主要内容,如果未能解决你的问题,请参考以下文章

1. 新建窗口

OPENGL中gladglewglfwFreeglut的区别

创建网格和启动窗口 SDL/GLEW C++ 时访问冲突

三维图形开发相关的库

为啥片段着色器没有附加?

freeglut窗口初始化+ glew 3.0上下文创建不起作用[关闭]