GLFW窗口

  • 头文件glad.h,glfw3.h, 包含顺序 glad,glfw3
  1. 初始化
    //1. 初始化
    if (glfwInit() == GLFW_FALSE)
    {
        cout << "init glfw fail";
        return 1;
    }
  1. 设置OpenGL配置
    //2. 基本设置, 版本号,和 core_profile
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#if __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
#endif
  1. 创建窗口
    //3. 创建窗口
    GLFWwindow *window = glfwCreateWindow(wWidth, wHeight, wName, nullptr, nullptr);
    if (window == nullptr)
    {
        cout << "Failed to create GLFW window";
        goto TERMINATE;
        //return 1;
    }
    //4. 当前主线程上下文窗口
    glfwMakeContextCurrent(window);
  1. 使用glad管理OpenGL指针
    //5. 使用glad管理OpenGL指针。
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        goto TERMINATE;
        //return 1;
    }
  1. 设置视口和resize回调
//6. 设置视口
glViewport(0, 0, wWidth, wHeight);
//7. 设置resize回调,对应刷新视口
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  1. 至此基本设置已经完成,进入渲染Loop
//8. 设置就绪,准备进入渲染的循环。
while (!glfwWindowShouldClose(window))
{
    //8.0 处理用户输入
    processInput(window);
    //************渲染纯色背景
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    //*************
    //8.1 交换颜色缓冲,(OpenGL双缓冲)
    glfwSwapBuffers(window);
    //8.2 事件派发
    glfwPollEvents();
}
  1. 最后在退出时清理window
TERMINATE:
glfwTerminate();
  1. 完整代码

    #include <iostream>

    //先后顺序
    #include "glad/glad.h"
    #include "GLFW/glfw3.h"

    using namespace std;

    const int wWidth = 800, wHeight = 600;
    const char* wName = "LearnOpenGL";


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

    int main(const int argc, const char*argv[])
    {
        //1. 初始化
        if (glfwInit() == GLFW_FALSE)
        {
            cout << "init glfw fail";
            return 1;
        }

        //2. 基本设置
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    #if __APPLE__
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
    #endif

        //3. 创建窗口
        GLFWwindow *window = glfwCreateWindow(wWidth, wHeight, wName, nullptr, nullptr);
        if (window == nullptr)
        {
            cout << "Failed to create GLFW window";
            goto TERMINATE;
            //return 1;
        }

        //4. 当前主线程上下文窗口
        glfwMakeContextCurrent(window);

        //5. 使用glad管理OpenGL指针。
        if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
        {
            std::cout << "Failed to initialize GLAD" << std::endl;
            goto TERMINATE;
            //return 1;
        }

        //6. 设置视口
        glViewport(0, 0, wWidth, wHeight);

        //7. 设置resize回调,对应刷新视口
        glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

        //8. 设置就绪,准备进入渲染的循环。
        while (!glfwWindowShouldClose(window))
        {
            //8.0 处理用户输入
            processInput(window);

            //*************  render
            glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            //*************

            //8.1 交换颜色缓冲,(OpenGL双缓冲)
            glfwSwapBuffers(window);

            //8.2 事件派发
            glfwPollEvents();
        }

    TERMINATE:
        glfwTerminate();
        return 0;
    }

文章作者: Yonggang Long
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Yonggang Long !
 上一篇
2022-08-10 Yonggang Long
下一篇 
2022-08-10 Yonggang Long
  目录