# 编译命令写在前面:
g++ -o out main.cpp lib/glad.c -lglfw -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor
初始化 GLFW 配置需要使用的 OpenGL 版本并启用核心开发模式
// main.cpp
#include <glad/glad.h> // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>
int main(){
// 初始化 GLFW
glfwInit();
// glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置 OpenGL 的主版本为 3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用 OpenGL 的核心开发模式
return 0;
}
// hint n. 暗示,提示
创建窗口并配置上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL);// 创建窗口,前三个参数依次是 宽、高、窗口名称
if(window==NULL){
std::cout<< "Failed to create window with glfw.\n";
glfwTerminate();// 如果窗口创建失败,则结束 GLFW
return -1;
}
glfwMakeContextCurrent(window);// 通知 GLFW 我们将使用该窗口。也被称为设置窗口上下文。
解决窗口缩放问题
void frameBufferSizeCallback(GLFWwindow* window, int width, int height){}// 设置窗口缩放的回调函数
glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册
初始化 glad
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){// 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
std::cout<< "Failed to initalize glad.\n"; // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
return -1;
}
设置渲染窗口并让渲染窗口随 GLFW 窗口一同缩放
// 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高
// 在回调函数中重新设置渲染窗口的大小和位置
void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}
让窗口持续存在
我们之前所写的程序编译后执行会什么都看不见,其实它只生成了一帧窗口,然后马上就消失掉了。所以我们看不见。因此需要让窗口被持续渲染。
while(!glfwWindowShouldClose(window)){ // 检查窗口是否需要被关闭
glfwSwapBuffers(window); // 交换颜色缓冲区,负责更新每一帧的颜色
glfwPollEvents(); // 监听用户的交互事件,鼠标、键盘输入等
}
释放资源
最后,释放掉所有的窗口和资源
glfwTerminate(); // 删除之前配置的所有资源
完整程序
#include <glad/glad.h> // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>
void frameBufferSizeCallback(GLFWwindow* window, int width, int height);
int main(){
// 初始化 GLFW
glfwInit();
// glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置 OpenGL 的主版本为 3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 使用 OpenGL 的核心开发模式
GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL); // 创建窗口,前三个参数依次是 宽、高、窗口名称
if(window==NULL){
std::cout<< "Failed to create window with glfw.\n";
glfwTerminate(); // 如果窗口创建失败,则结束 GLFW
return -1;
}
glfwMakeContextCurrent(window); // 通知 GLFW 我们将使用该窗口
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ // 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
std::cout<< "Failed to initalize glad.\n"; // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
return -1;
}
// 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高
glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册
while(!glfwWindowShouldClose(window)){ // 检查窗口是否需要被关闭
glfwSwapBuffers(window); // 交换颜色缓冲区,负责更新每一帧的颜色
glfwPollEvents(); // 监听用户的交互事件,鼠标、键盘输入等
}
glfwTerminate(); // 删除之前配置的所有资源
return 0;
}
// hint n. 暗示,提示
// g++ -o out main.cpp lib/glad.c -lglfw -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor
void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}// 设置回调函数
编译运行后,会得到一个黑色窗口:
标签:窗口,OpenGL,int,window,GLFW,Linux,glfwWindowHint From: https://www.cnblogs.com/torch-hxm/p/17921656.html