文章目录
- 前期准备
- 下载GLFW
- 下载GLAD
- 引入库文件
- 生成窗口
- 重要概念——双缓冲 (double buffer)
- 代码实现
- 学习总结
前期准备
下载GLFW
GLFW DOWNLOAD
解压后使用CMake编译至新创建的bulid文件夹下:
下载GLAD
引入库文件
创建好工程,将准备好的头文件和dll文件,分别放置在include文件夹和libs文件夹下后,在工程中引入库文件:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
生成窗口
重要概念——双缓冲 (double buffer)
由于颜色是以逐个像素的方式进行绘制,所以单缓冲会出现图片闪烁的情况,有不真实感。双缓冲利用前缓冲显示最终图像,当后缓冲完全渲染后,与前缓冲交换,从而解决图像闪烁的问题。
代码实现
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height); //调整窗口大小时的回调函数
void process_input(GLFWwindow* window); //处理输入的回调函数
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(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Fail to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//注册窗口大小调整时的回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//设置窗口维度
glViewport(0, 0, 800, 600);
while (!glfwWindowShouldClose(window))
{
// 输入
process_input(window);
// 渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //设置清除颜色
glClear(GL_COLOR_BUFFER_BIT); //执行清除
// 检查并调用事件,交换缓冲
glfwSwapBuffers(window); //双缓冲 (double buffer)
glfwPollEvents(); //检测触发事件(键盘输入、鼠标移动等)
}
glfwTerminate();
return 0;
}
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);
}
}
学习总结
生成窗口并在窗口中用深绿色填充窗口,整体流程体现出OpenGL状态机的本质——状态设置、状态使用,回调函数用于渲染过程中的输入处理(比如键盘、鼠标的输入等)。