0%

OpenGL新建窗口

OpenGL新建窗口

1 安装依赖包

1
2
3
sudo apt install libgl1-mesa-dev
sudo apt install libglew-dev libsdl2-dev libsdl2-image-dev libglm-dev libfreetype6-dev
sudo apt install libglfw3-dev libglfw3

2 Hello Window

2.1 初始化glfw

1
2
3
4
5
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
  • 调用glfwInit函数初始化glfw
  • glfwWindowHint函数有两个参数,前一个参数指代某个glfw设置项,后一个参数是一个整型值
  • GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR分别是指定的OpenGL版本号,例如这里是3.3版本
  • GLFW_OPENGL_PROFILE配置为GLFW_OPENGL_CORE_PROFILE,表明使用OpenGL核心模式
  • GLFW_OPENGL_FORWARD_COMPAT设置为GL_TRUE,保证程序的前向兼容性

2.2 创建窗口

1
2
3
4
5
6
7
8
9
10
// 创建一个窗口
GLFWwindow *window = glfwCreateWindow(800, 600, "Hello, OpenGL", nullptr, nullptr);
if (!window) {
std::cout << "create window failed." << std::endl;
glfwTerminate();
return -1;
}

// 将OpenGL上下文和新创建的窗口绑定
glfwMakeContextCurrent(window);
  • glfwCreateWindow函数创建一个窗口,参数分别是,
参数 作用
width 窗口宽度
height 窗口高度
title 窗口标题
monitor 监视器(全屏模式下需指定)
share 共享上下文的另一个窗口(没有就不需要给定,传递NULL即可)
  • glfwMakeContextCurrent函数将当前OpenGL上下文和窗口绑定

2.3 初始化glew

1
2
3
4
5
if (glewInit() != GLEW_OK) {
std::cout << "glew init failed." << std::endl;
glfwTerminate();
return -1;
}
  • 调用glewInit函数初始化glew,如果失败,就调用glfwTerminate函数退出整个程序
  • GLEW 是OpenGL扩展库,使用它可以很方便的调用OpenGL较新的特性。GLEW能自动识别你的平台所支持的全部OpenGL高级扩展涵数,也就是说,只要包含一个glew.h头文件,你就能使用gl, glu, glext, wgl, glx的全部函数

2.4 视口

  • 视口(View Port)是窗口内的一块可绘制区域,可以调用glViewport函数为某个窗口指定视口,
1
2
3
4
5
6
void framebuffer_size_callback(GLFWwindow *window, int width, int height) {
// 左下角坐标、宽度、高度
glViewport(0, 0, width, height);
}

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  • glfwSetFramebufferSizeCallback设置窗口大小改变时的回调函数,在这里,重置视口的左下角坐标和宽度、高度

2.5 渲染循环

1
2
3
4
while(!glfwWindowShouldClose(window)) {
glfwSwapBuffers(window);
glfwPollEvents();
}
  • glfwWindowShouldClose函数判断给定的窗口是否应该被关闭,通常是用户鼠标点击窗口右上方的叉时
  • glfwSwapBuffers函数将前缓冲(front buffer)和后缓冲(back buffer)的内容交换,因为渲染应用了双缓冲技术,前缓冲的内容直接被展现在显示器上,而所有的的渲染指令都会在后缓冲上绘制
  • glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)

2.6 处理输入

1
2
3
4
5
void processInput(GLFWwindow *window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
}
  • 调用glfwGetKey函数可以得到一个按键当前的状态,GLFW_PRESS代表按下,GLFW_RELEASE

代表松开

  • glfwSetWindowShouldClose函数设置窗口是否应该被关闭

2.7 清空窗口

1
2
3
// redering
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
  • glClearColor函数设置清空窗口的底色,而glCear执行实际的清空操作,这里参数传递GL_COLOR_BUFFER_BIT表明此举是为了将窗口颜色清空