文章目录
- 前期准备
- 下载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状态机的本质——状态设置、状态使用,回调函数用于渲染过程中的输入处理(比如键盘、鼠标的输入等)。