新建OpenGL窗口


  我们搭建好了环境以后,我们需要新建一个窗口,这个窗口用于承载我们所话的图形,否则我们画出来的图形是无法显示的。首先,我们需要新建一个CPP文件,然后导入我们所需要的头文件:


    #include "glad/glad.h"
    #include "GLFW/glfw3.h"
    #include "iostream"
    using namespace std;
						

  然后我们需要在main函数内初始化GLFW:


    int main(){
        // 初始化GLFW
        glfwInit();
        // 将OpenGL的版本设置为4.0
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
        // 配置GLFW,如果是Mac系统使用注释语句
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
        //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
        return 0;
    }
						

  现在,我们要在main函数下新建窗口:


    // 使用GLFW创建窗口,传入的参数为窗口的长宽,字符串为这个窗口的名字
    GLFWwindow* window = glfwCreateWindow(800, 600, "HelloOpenGL", NULL, NULL);
    // 如果初始化不成功
    if (window == NULL) {
        cout << "Failed to create GLFW window" << endl;
        glfwTerminate();
        return -1;
    }
    // 使用上下文初始化窗口
    glfwMakeContextCurrent(window);
						

  我们配好了GLFW,也建了窗口,现在我们要在main函数下配置GLAD:


    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    // 设置渲染窗口,前两个参数为渲染窗口的初始点(左下角)后两个参数为渲染窗口的宽高
    glViewport(0, 0, 800, 600);
						

  注意,在glViewport渲染窗口内,我们的OpenGL坐标的值只是-1~1之间的值,即使我们的中心点坐标为(400,300),在OpenGL中这个中心点的坐标都为(-0.5,0.5)在OpenGL的坐标中,无论是X轴还是Y轴,它的值都是映射为-1~1的范围之间。

  我们配置好了GLFW和GLAD,也建了窗口和渲染窗口,但是我们的窗口是可以拖动改变其大小的,那么我们就需要一个函数来当我们改变窗口大小的时候改变我们的渲染窗口的大小:


    void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
        glViewport(0, 0, width, height);
    }
						

  然后我们在main函数下进行绑定,这个绑定将会在我们更改窗口大小的时候调用,从而更改我们的渲染范围


    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
						

  现在我们可以在main函数下写入渲染相关内容了:


    while (!glfwWindowShouldClose(window)) {
        // 绑定输入设置
        processInput(window);

        // ......画图相关内容写在这个位置......
		
        // 检查并调用事件
        glfwSwapBuffers(window);
        // 交换缓冲区域
        glfwPollEvents();
    }
    // 释放资源
    glfwTerminate();
    return 0;
						

  我们现在运行就可以看到我们的窗口了,如下图:


  同样,我们可以在渲染内的画图相关位置写入以下内容来修改我们的背景颜色,来验证画图相关的内容是否写在这个位置:


    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
						

  运行效果如下:


  可以看到,我们将RBGA值为(0.2,0.3,0.3,1.0)的颜色填充进了我们的窗口,现在,我们完成了项目的初始化设置,我们搭配了GLFW,GLAD,并成功的创建了渲染窗口并且成功的画出了我们的背景。



  本篇完整代码如下:


    #include "glad/glad.h"
    #include "GLFW/glfw3.h"
    #include "iostream"
    using namespace std;

    // 函数的声明
    void framebuffer_size_callback(GLFWwindow* window, int width, int height);
    void processInput(GLFWwindow* window);

    int main() {
        // 初始化GLFW
        glfwInit();
        // 设置OpenGL版本号为4.0
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
        // 配置GLFW
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

        // 使用GLFW创建窗口,传入的参数为窗口的长宽,字符串为这个窗口的名字
        GLFWwindow* window = glfwCreateWindow(400, 300, "HelloOpenGL", NULL, NULL);
        if (window == NULL) {
            cout << "Failed to create GLFW window" << endl;
            glfwTerminate();
            return -1;
        }
        // 使用上下文初始化窗口
        glfwMakeContextCurrent(window);

        // 初始化GLAD
        if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
            std::cout << "Failed to initialize GLAD" << std::endl;
            return -1;
        }
        // 设置渲染窗口,前两个参数为渲染窗口的初始点,后两个参数为渲染窗口的宽高
        glViewport(0, 0, 400, 300);

        // 绑定函数当窗口大小发生变化时重新设置渲染窗口大小
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

        // 渲染
        while (!glfwWindowShouldClose(window)) {
            // 绑定输入设置
            processInput(window);

            // 设置颜色
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);

            // 检查并调用事件
            glfwSwapBuffers(window);
            // 交换缓冲区域
            glfwPollEvents();
        }

        glfwTerminate();
        return 0;
    }

    // 修改渲染窗口大小函数
    void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
        glViewport(0, 0, width, height);
    }

    // 配置输入相关函数
    void processInput(GLFWwindow* window) {
        if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
            glfwSetWindowShouldClose(window, true);
    }