文章目录
- glfw
- glad
- 创建窗口进行渲染的基本流程
- 目的
- main.cpp
- CMakeLists.txt
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版本,简化了跨平台开发的复杂性
创建窗口进行渲染的基本流程
目的
利用glfw和glad进行窗口的创建,然后循环渲染。
怎么在vscode上使用cmake构建项目,具体可以看这篇Windows上如何使用CMake构建项目 - 凌云行者的博客
main.cpp
#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
# 设置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)