在OpenGL 入门 0中,我们主要使用了glfw与glaw两个库对我们基础环境进行配置。glfw主要是处理OpenGL上下文、定义窗口参数以及处理用户输入。GLAD是用来管理OpenGL的函数指针的。
一、头文件
#include <glad/glad.h>
#include <GLFW/glfw3.h>
二、窗口的实例化与创建
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwInit:初始化GLFW
glfwWindowHint:配置GLFW,第一个参数代表选项的名称,我们可以从很多以GLFW_开头的枚举值中选择;第二个参数接受一个整型,用来设置这个选项的值。代码中将主版本号(Major)和次版本号(Minor)都设为3。同时告诉GLFW我们使用的是核心模式(Core-profile)。明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)。如果是苹果设备,就得再写如上一条配置语句。
glfwCreateWindow:创建窗口对象。前两个参数为宽和高,第三个参数表示这个窗口的名称(标题),最后两个参数我们暂时忽略。
glfwMakeContextCurrent:通知GLFW将我们窗口的上下文设置为当前线程的主上下文
三、GLAD初始化
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。我们给GLAD传入了用来加载系统相关的OpenGL函数指针地址的函数。GLFW给我们的是glfwGetProcAddress,它根据我们编译的系统定义了正确的函数。
四、视口
在开始渲染之前,我们必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。
glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
当用户改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
五、按键输入
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
glfwGetKey:判断当前指定按键是否按下。有GLFW_PRESS、GLFW_RELEASE两种状态。
glfwSetWindowShouldClose:将WindowShouldClose属性设置为 true,代表程序是否要关闭。
五、渲染循环(Render Loop)
while(!glfwWindowShouldClose(window))
{
// 输入
processInput(window);
// 清空缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 交换缓冲,检查并调用事件
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。
glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。
glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
glClear:通过缓冲位(Buffer Bit)指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。
glClearColor:使用指定颜色来填充缓冲区。