1. 配置环境,创建项目
https://learnopengl-cn.github.io/01%20Getting%20started/02%20Creating%20a%20window/
配置环境:按照教程一步一步配置,没有出现bug。注意cmake和visualstudio都是最新版本。并且,创建了一个专门存放lib和include的文件夹:D:\develop\opengl library,把这个文件夹的include和lib文件夹放入项目的配置下。
主要配置了两个库:GLAD和GLFW。
创建项目:直接创建一个空项目。
GLFW:一个OpenGL第三方库。用来创建OpenGL上下文,操作窗口。
GLAD:用来访问OpenGL规范接口的第三方库。
2. 窗口创建
2.1 引入头函数
#include <glad/glad.h>
#include <GLFW/glfw3.h>
2.2 初始化GLFW函数
//----- 以下都是写在main函数里------
// 初始化GLFW
glfwInit();
// 关于glfwWindowHint参数的选项在:https://www.glfw.org/docs/latest/window.html#window_hints
// 参数GLFW_CONTEXT_VERSION_MAJOR:明确客户端API的版本,对context的内容有影响
// Major:主版本为3,MINOR:次版本号为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// GLFW_OPENGL_PROFILE:定义OpenGL模式(profile),使用的是核心模式。( core)
// (创建opengl上下文)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
2.3 创建窗口对象
// 参数:宽,高,窗口名称
// 会返回一个GLFWwindow对象
GLFWwindow*window=glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window==NULL)
{
std::cout<<"Failed to create GLFW window"<<std::endl;
glfwTerminate();
return-1;
}
// 通知GLFW将窗口的上下文设置为当前线程主上下文。
glfwMakeContextCurrent(window);
2.4 GLAD
功能:用来管理openGL的函数指针。
// GLFW给的:glfwGetProcAddress
// 判断是否正确初始化了GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout<<"Failed to initialize GLAD"<<std::endl;
return-1;
}
2.5 viewport创建
// 设置渲染尺寸的大小。
// 前两个:左下角位置,后两个:宽高
glViewport(0, 0, 800, 600);
// 回调函数:每次窗口大小被调整时调用。把viewport设置得和窗口一样大,自适应。
voidframebuffer_size_callback(GLFWwindow*window, intwidth, intheight);
voidframebuffer_size_callback(GLFWwindow*window, intwidth, intheight)
{
glViewport(0, 0, width, height);
}
// 注册回调函数,让回调函数知道什么时候被调用:窗口大小改变的时候(framebuffer_size_callback)
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
OpenGL坐标范围是-1~1,就是把这个范围映射到viewport设置的0-800,0-600范围。
2.6 保持窗口一直开着
开一个渲染循环(render loop)
while(!glfwWindowShouldClose(window))
{
// 交换颜色缓冲
glfwSwapBuffers(window);
// glfwPollEvents检查有没有触发什么事件。
glfwPollEvents();
}
2.7 释放资源
glfwTerminate();
return 0;
完成了窗口创建到显示的整个过程。
如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7b7775e249c1bdb9d9122d0826061e21.png)
3. 判断按键
输入要一个单独的函数来实现。这里的输入包括:按键是否被按下。
voidprocessInput(GLFWwindow*window)
{
// GLFW_KEY_ESCAPE:esc键
if(glfwGetKey(window, GLFW_KEY_ESCAPE) ==GLFW_PRESS)
// 关闭GLFW的方法
glfwSetWindowShouldClose(window, true);
}
//判断操作要在每个循环里都判断,所以放在while循环里。
while (!glfwWindowShouldClose(window))
{
processInput(window);
glfwSwapBuffers(window);
glfwPollEvents();
}
4. 加上渲染
// 使用四个参数,分别是红色分量、绿色分量、蓝色分量、alpha分量。表示的是比重。0.2表示红色透过0.2. alpha分量是透明度。
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
// 指定清空的缓冲是颜色缓冲。
glClear(GL_COLOR_BUFFER_BIT);
渲染加在:判断按键之后,缓冲图像之前。
渲染之前要做:清空屏幕。