Linux OpenGL (2) —— 创建窗口

发布时间 2023-12-22 16:16:09作者: Torch_HXM
# 编译命令写在前面:
g++ -o out main.cpp lib/glad.c -lglfw -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor

初始化 GLFW 配置需要使用的 OpenGL 版本并启用核心开发模式

// main.cpp
#include <glad/glad.h>      // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>

int main(){
    // 初始化 GLFW
    glfwInit();
    // glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // 设置 OpenGL 的主版本为 3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                  // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用 OpenGL 的核心开发模式

    return 0;
}

// hint n. 暗示,提示

创建窗口并配置上下文

GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL);// 创建窗口,前三个参数依次是 宽、高、窗口名称
if(window==NULL){
	std::cout<< "Failed to create window with glfw.\n";
	glfwTerminate();// 如果窗口创建失败,则结束 GLFW
	return -1;
}
glfwMakeContextCurrent(window);// 通知 GLFW 我们将使用该窗口。也被称为设置窗口上下文。

解决窗口缩放问题

void frameBufferSizeCallback(GLFWwindow* window, int width, int height){}// 设置窗口缩放的回调函数
glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册

初始化 glad

if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){// 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
	std::cout<< "Failed to initalize glad.\n";      // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
	return -1;
}

设置渲染窗口并让渲染窗口随 GLFW 窗口一同缩放

// 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高
// 在回调函数中重新设置渲染窗口的大小和位置
void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}

让窗口持续存在

我们之前所写的程序编译后执行会什么都看不见,其实它只生成了一帧窗口,然后马上就消失掉了。所以我们看不见。因此需要让窗口被持续渲染。

while(!glfwWindowShouldClose(window)){     // 检查窗口是否需要被关闭
	glfwSwapBuffers(window);           // 交换颜色缓冲区,负责更新每一帧的颜色
	glfwPollEvents();                  // 监听用户的交互事件,鼠标、键盘输入等
}

释放资源

最后,释放掉所有的窗口和资源

glfwTerminate();                          // 删除之前配置的所有资源

完整程序

#include <glad/glad.h>      // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>

void frameBufferSizeCallback(GLFWwindow* window, int width, int height);

int main(){
    // 初始化 GLFW
    glfwInit();
    // glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // 设置 OpenGL 的主版本为 3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                  // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用 OpenGL 的核心开发模式

    GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL);  // 创建窗口,前三个参数依次是 宽、高、窗口名称
    if(window==NULL){
        std::cout<< "Failed to create window with glfw.\n";
        glfwTerminate();                                                                // 如果窗口创建失败,则结束 GLFW
        return -1;
    }
    glfwMakeContextCurrent(window);                                 // 通知 GLFW 我们将使用该窗口

    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){        // 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
        std::cout<< "Failed to initalize glad.\n";                  // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
        return -1;
    }

    // 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
    glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高

    glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册

    while(!glfwWindowShouldClose(window)){                          // 检查窗口是否需要被关闭
        glfwSwapBuffers(window);                                    // 交换颜色缓冲区,负责更新每一帧的颜色
        glfwPollEvents();                                           // 监听用户的交互事件,鼠标、键盘输入等
    }

    glfwTerminate();                                                // 删除之前配置的所有资源

    return 0;
}

// hint n. 暗示,提示
// g++ main.cpp -lglfw

void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}// 设置回调函数

编译运行后,会得到一个黑色窗口:

image