OpenGL入门001——使用glad和glfw创建一个窗口

glfw

概述: 用于OpenGL开发中创建窗口、上下文和处理输入等操作。提供跨平台支持,简化了底层的操作系统调用

作用:

  • 窗口和上下文管理:
    • 创建窗口:GLFW提供API创建OpenGL窗口,并设置窗口大小、标题、位置等,窗口是渲染图像的主要界面
    • OpenGL上下文:每个窗口都有独立的OpenGL上下文,用于管理OpenGL的状态和资源。GLFW自动为窗口创建上下文,简化开发流程
    • 双缓冲:GFLW支持双缓冲,用于减少图形闪烁问题,在双缓冲模式下,渲染的图像会在后台缓冲区绘制,完成后交换到前台缓冲区,实现平滑显示
  • 输入处理:
    • 键盘输入:GLFW提供API监听键盘事件,包括按键按下、释放等,开发者可以查询某个按键的状态,或使用回调函数处理键盘输入
    • 鼠标输入:GLFW还提供鼠标位置、滚轮和按键事件的处理。
    • 手柄/控制器支持:GLFW支持游戏手柄,适用于需要控制器输入的应用
  • 事件管理:
    • 窗口事件:GLFW可以监听窗口的事件,包括窗口大小改变、窗口关闭等事件。开发者可以注册相应的回调函数,方便实现窗口重绘或调整界面元素
    • 刷新帧:GLFW提供了帧刷新功能,让开发者在双缓冲模式下完成每帧的渲染后,将图像从后台缓冲区切换到前台

glad

概述: 是一个用于管理OpenGL函数指针的库,由于OpenGL是一个跨平台的图形API,不同平台上的OpenGL实现可能会有所不同,因此需要一个工具来加载和管理这些函数指针。

作用:

  • 加载OpenGL函数指针:OpenGL函数在运行时由驱动程序提供,GLAD负责加载这些函数指针,使得程序可以调用OpenGL函数
  • 跨平台支持:glad支持多种平台和opengl版本,简化了跨平台开发的复杂性

创建窗口进行渲染的基本流程

简介

怎么在vscode上使用cmake构建项目,具体可以看这篇Windows上如何使用CMake构建项目 - 凌云行者的博客

目的: 利用glfw和glad进行窗口的创建,然后循环渲染。

环境:

  • 编译工具链:使用msys2安装的mingw-gcc
  • 依赖项:glfw3:x64-mingw-static,glad:x64-mingw-static(通过vcpkg安装)

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>

using std::cout;
using std::endl;

// 屏幕宽度
const unsigned int SCR_WIDTH = 800;
// 屏幕高度
const unsigned int SCR_HEIGHT = 600;

// 窗口大小改变的回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
// 确保视口与新窗口尺寸匹配,注意在视网膜显示器上,宽度和高度会显著大于指定值
glViewport(0, 0, width, height);
}

// 处理输入
void process_input(GLFWwindow* window) {
// 按下ESC键时进入if块
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
// 关闭窗口
glfwSetWindowShouldClose(window, true);
}

int main() {
// 初始化glfw
glfwInit();
// 设置opengl版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// 使用核心模式:确保不使用任何被弃用的功能
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// 创建glfw窗口
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "I am window title", NULL, NULL);
if (window == NULL) {
cout << "Failed to create glfw window" << endl;
// 终止GLFW
glfwTerminate();
return -1;
}
// 设置当前窗口的上下文
glfwMakeContextCurrent(window);
// 设置窗口大小改变的回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

// 加载opengl函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
cout << "Failed to initialize GLAD" << endl;
return -1;
}

// 循环渲染
while (!glfwWindowShouldClose(window)) { // 检查是否应该关闭窗口
// 处理输入
process_input(window);

// 清空屏幕所用的颜色
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
// 清空颜色缓冲,主要目的是为每一帧的渲染准备一个干净的画布
glClear(GL_COLOR_BUFFER_BIT);

// 交换缓冲区
glfwSwapBuffers(window);
// 处理所有待处理事件,去poll所有事件,看看哪个没处理的
glfwPollEvents();
}

// 终止GLFW,清理GLFW分配的资源
glfwTerminate();
return 0;
}

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 设置CMake的最低版本要求
cmake_minimum_required(VERSION 3.10)
# 设置项目名称
project(HelloWorld)

# vcpkg集成, 这里要换成你自己的vcpkg工具链文件和共享库路径
set(VCPKG_ROOT D:/software6/vcpkg/)
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
set(CMAKE_PREFIX_PATH ${VCPKG_ROOT}/installed/x64-mingw-static/share)

# 查找所需的包
find_package(glad CONFIG REQUIRED)
find_package(glfw3 CONFIG REQUIRED)

# 添加可执行文件
add_executable(HelloWorld main.cpp)

# 链接所需的库
target_link_libraries(HelloWorld PRIVATE glad::glad glfw)

最终效果


OpenGL入门001——使用glad和glfw创建一个窗口
http://example.com/2024/10/31/OpenGL入门001——使用glad和glfw创建一个窗口/
作者
凌云行者
发布于
2024年10月31日
许可协议