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

Posted 芥末的无奈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 结束时,释放所有资源

以上是关于LearnOpenGL 笔记 - 入门 03 你好,窗口的主要内容,如果未能解决你的问题,请参考以下文章

LearnOpenGL - Android OpenGL ES 3.0 绘制三角形

OpenGL - 如何理解 VAO 与 VBO 之间的关系

LearnOpenGL 笔记 - 入门 02 创建窗口

LearnOpenGL 笔记 - 入门 01 OpenGL

learnopengl“入门”的全部代码

LearnOpenGL学习笔记9:材质