GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的。
获取GLFW
直接从官方网站中下载预编译文件:https://www.glfw.org/download.html CMakeLists.txt示例(仅Windows):
include_directories("glfw-3.4.bin.WIN64/include/GLFW")
set(glfw3 "${CMAKE_SOURCE_DIR}/CEngine/ThirdParty/glfw3/lib/glfw3.lib")最小系统
flowchart LR
n1["GLFW初始化"] --> n2["创建窗口"] --> n3["设置上下文"]
subgraph loop["循环"]
l1{"判断窗口关闭"} --> l2["绘制"] --> l3["交换缓冲区"] --> l4["处理事件"] --> l1
end
n3 --> l1
#include <glfw3.h>
int main() {
if ( !glfwInit() ) return -1; // 初始化失败
glfwWindowHint(GLFW_VERSION_MAJOR, 4); // 设置主版本
glfwWindowHint(GLFW_VERSION_MINOR, 6); // 设置次版本
/* 创建窗口 */
GLFWwindow *window = glfwCreateWindow(1920, 1080, "Title", nullptr, nullptr);
/* 窗口创建失败 */
if ( !window ) {
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window); // 设置当前上下文
/* 主循环 */
while (!glfwWindowShouldClose(window)) {
/*
... // 绘制部分
*/
glfwSwapBuffers(window); // 交换缓冲区
glfwPollEvents(); // 处理事件
}
return 0;
}函数
[!warning|aside-right] 仅限主线程调用
glfwInit 和 glfwTerminate
- glfwInit:该函数用于初始化GLFW库,在调用大多数GLFW函数之前,必须先初始化GLFW。
int glfwInit()
成功时返回GLFW_TRUE,若发生错误则返回GLFW_FALSE。
- glfwTerminate:该函数用于销毁所有窗口和光标,恢复任何被修改的伽马校正曲线,并释放其他所有分配的资源。
void glfwTerminate()
[!warning|aside-right] 仅限主线程调用
glfwWindowHint
用于在创建窗口和 OpenGL/Vulkan 上下文之前设置提示(hints),这些提示会指导 GLFW 如何配置后续创建的窗口及其关联的渲染上下文。
void glfwWindowHint(int hint, int value)
部分示例:
glfwWindowHint(GLFW_VERSION_MAJOR, 4); // 设置主版本
glfwWindowHint(GLFW_VERSION_MINOR, 6); // 设置次版本
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE); // 窗口不可调整大小
glfwWindowHint(GLFW_SAMPLES, 4); // 启用 4x 多重采样抗锯齿
glfwWindowHint(GLFW_DOUBLEBUFFER, GLFW_TRUE); // 启用双缓冲(默认)
glfwWindowHint(GLFW_REFRESH_RATE, 60); // 尝试设置刷新率为 60Hz
[!warning|aside-right] 仅限主线程调用
glfwCreateWindow
创建一个窗口及其关联的上下文。
GLFWwindow *glfwCreateWindow(
int width,
int height,
const char *title,
GLFWmonitor *monitor,
GLFWwindow *share,
)
- 参数:
width—— 窗口的期望宽度height—— 窗口的期望宽度title—— 窗口的标题(UTF-8编码)monitor—— 用于全屏模式的显示器,若为窗口模式则为NULLshare—— 要与其共享资源的窗口,若不共享资源则为NULL
- 返回值:
- 创建的窗口的句柄,若发生错误则返回
NULL
- 创建的窗口的句柄,若发生错误则返回
glfwMakeContextCurrent
用于将指定的 OpenGL 或 Vulkan 渲染上下文绑定到当前线程,使其成为当前线程的活动上下文。
void glfwMakeContextCurrent(GLFWwindow* window)- 参数:
window—— 要绑定的GLFWwindow指针,如果传入NULL,则解绑当前线程的上下文
- 无返回值
glfwWindowShouldClose
检查指定窗口的关闭标志。
int glfwWindowShouldClose(GLFWwindow *window)glfwSwapBuffers
当启用双缓冲技术时(默认启用),调用该函数以交换前后台缓冲区
void glfwSwapBuffers(GLFWwindow *window)