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) { 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); GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "I am window title", NULL, NULL); if (window == NULL) { cout << "Failed to create glfw window" << endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); 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); glfwPollEvents(); } 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_minimum_required(VERSION 3.10)
project(HelloWorld)
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)
|
最终效果