LearnOpenGL笔记 | 创建一个窗口
本文适合拥有一些图形学概念的人观看,且是自己记录的笔记,非常粗糙。
我们直接看代码
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
这段代码算是创建窗口的最简代码。我们一段一段看
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
首先是引入头文件,注意glad要在glfw之前引入,因为在GLFW中需要有OpenGL函数的实现,如果没有则会报错。iostream方便我们调试代码,即输出错误信息。
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置OpenGL模式为核心模式
进入main函数后就是使用glfwInit();
初始化GLFW,否则GLFW中某些函数是用不了的。
在接下来三行先设置OpenGL版本,以及核心模式。
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
这一行代码是用来创建一个GLFWwindow
对象使用glfwCreateWindow
函数创建。
glfwCreateWindow()有5个参数分别是
- width窗口的宽度
- height窗口的高度
- title窗口的标题
- monitor指定窗口是否为全屏模式
- share指定与新窗口共享资源的现有窗口
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwCreateWindow返回创建的窗口句柄。若失败(如未初始化 GLFW 或驱动不支持),返回 NULL
。根据错误打印错误信息以及调用 glfwTerminate();
结束glfw,返回-1异常退出
glfwTerminate();
会释放资源和终止GLFW主线程
glfwMakeContextCurrent(window);
在窗口window中创建上下文,应在gladLoadGLLoader前创建上下文。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
加载GLAD函数。
while (!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
进入主循环如果window没被关闭则一直循环,glfwSwapBuffers会交换画面缓冲区,glfwPollEvents会拉取一次事件。
glfwTerminate();
return 0;
最后清理退出。