LearnOpenGL 笔记 - 入门 03 你好,窗口

系列文章目录



Hello Window

代码并不长,直接上代码说明

//
// Created by user on 8/12/22.
//
#include "glad/glad.h"

#include <GLFW/glfw3.h>

#include <iostream>
#include <vector>
using namespace std;

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

void processInput(GLFWwindow *window) {
    
    
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

int main() {
    
    
    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(800, 600, "LearnOpenGL", nullptr, nullptr);
    if (window == nullptr) {
    
    
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    
    
        std::cerr << "gladLoadGLLoader failed\n";
        return -1;
    }

    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    for (; !glfwWindowShouldClose(window);) {
    
    
        processInput(window);

        glClearColor(0.8f, 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);
}

其中:

#include "glad/glad.h"
#include <GLFW/glfw3.h>
  • 引入 glad.h 和 glfw3.h 头文件,确保我们的工程能够正常引用到这两个头文件
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  • glfwInit 初始化 glfw 库,在调用任何 glfw 函数前都应该先做初始化
  • glfwWindowHint 用来配置 glfw。上述代码告诉 glfw 我们要使用 OpenGL 3.3 版本,且希望是 Core-profile
GLFWwindow *window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr) {
    
    
    std::cout << "Failed to create GLFW window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);
  • glfwCreateWindow 创建窗口。800 表示宽,600 表示高,“LearnOpenGL” 为窗口标题。glfwCreateWindow 同时也会创建 OpenGL context
  • glfwMakeContextCurrent(window) 设置当前线程的 OpenGL context
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    
    
    std::cerr << "gladLoadGLLoader failed\n";
    return -1;
}
  • GLAD 是用来管理 OpenGL 的函数指针的,使用 gladLoadGLLoader 初始化 GLAD
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
    
    
    glViewport(0, 0, width, height);
}
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  • glViewport 用来调整渲染窗口的大小。glViewport 函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。
  • framebuffer_size_callback 注册到窗口中,使得当窗口大小发生变化时,glfw 能够回调该函数从而修改渲染窗口的大小
void processInput(GLFWwindow *window) {
    
    
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

for (; !glfwWindowShouldClose(window);) {
    
    
    processInput(window);

    glfwSwapBuffers(window);
    glfwPollEvents();
}
  • 我们在一个 for 循环中不断地进行渲染窗口,我们可以把它称之为渲染循环(Render Loop)
  • glfwWindowShouldClose 如果该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了
  • processInput 处理用户输入,如果用户按下 esc 键,也会退出
  • glfwSwapBuffers 函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上
  • glfwPollEvents 函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)
glfwTerminate();
  • glfwTerminate 释放/删除之前的分配的所有资源

总结

虽然这个例子很简单,但已经有了 OpenGL 程序的基本框架了,步骤如下:

  1. 初始化 glfw
  2. 创建窗口和 OpenGL Context,并设置当前线程的 Context
  3. 初始化 GLAD
  4. 在渲染循环(Render Loop)进行图形渲染
  5. 结束时,释放所有资源

猜你喜欢

转载自blog.csdn.net/weiwei9363/article/details/128956958