LearnOpenGL 笔记 - 入门 03 你好,窗口
创始人
2024-05-24 14:52:49
0

系列文章目录

  • LearnOpenGL 笔记 - 入门 01 OpenGL
  • LearnOpenGL 笔记 - 入门 02 创建窗口

文章目录

  • 系列文章目录
  • Hello Window
  • 总结


Hello Window

  • 原文链接:你好,窗口
  • 本文代码:1_1_hello_window.cpp

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

//
// Created by user on 8/12/22.
//
#include "glad/glad.h"#include #include 
#include 
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);
#endifGLFWwindow *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 
  • 引入 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. 结束时,释放所有资源

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...