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();