本教程严格按照https://learnopengl-cn.github.io/教程来学习与总结以及问题,本教程只会说明博主本人遇到的问题与解决方案。
在开始编程前,你需要配置环境。
一、环境
window10 (1903)
16G
CPU:I5-6600K
IDE:VS2019
OpenGL:3.3
二、配置环境
cmake:vs是自带cmake的,但是怎么尝试都不行,没有生成 glfw3.lib 按照教程走,没有遇到问题
把各种头文件新建文件夹中,并在IDE中设置好“包含目录”和“库目录”路径。
可能会遇到找不到头文件的情况:比如
#include <glad/glad.h>
#include <GLFW/glfw3.h>
这是因为“/”是指文件夹中的意思,也就是不能仅仅把文件复制到自建的文件夹中,要把本身的文件夹复制进来,可以说是习惯问题,但是大家都这么写,为了头文件的一致性,所以还是这样来比较好。
配置完成后,新建cpp,能运行不报错就算配置完成了,如果你是macos,需要注释掉的代码,但我记得xcode貌似很方便。
#include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow* window); int main() { //实例化GLFW窗口 glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //我们将主版本号(Major)和次版本号(Minor)都设为3。我们同样明确告诉GLFW我们使用的是核心模式(Core-profile) //如果是mac系统,还需要下面这行代码 //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //创建一个窗口对象,这个窗口对象存放了所有和窗口相关的数据,而且会被GLFW的其他函数频繁地用到 GLFWwindow* window = glfwCreateWindow(600, 600, "LearnOpenGL", NULL, NULL); //glfwCreateWindow函数需要窗口的宽和高作为它的前两个参数。第三个参数表示这个窗口的名称(标题) //这个函数将会返回一个GLFWwindow对象, if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } //创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了。 glfwMakeContextCurrent(window); //告诉GLFW我们希望每当窗口调整大小的时候调用这个函数 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } //我们可不希望只绘制一个图像之后我们的应用程序就立即退出并关闭窗口。 //我们希望程序在我们主动关闭它之前不断绘制图像并能够接受用户输入。 //因此,我们需要在程序中添加一个while循环,我们可以把它称之为渲染循环(Render Loop), //它能在我们让GLFW退出前一直保持运行。 while (!glfwWindowShouldClose(window)) //glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出, //如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。 { //输入 processInput(window); //渲染 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //当调用glClear函数,清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色 glClear(GL_COLOR_BUFFER_BIT); //glClear函数来清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲, //可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。 //glClearColor函数是一个状态设置函数,而glClear函数则是一个状态使用的函数, //它使用了当前的状态来获取应该清除为的颜色。 //检查并且调用事件,交换缓存 glfwSwapBuffers(window); //函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲), //它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。 glfwPollEvents(); //检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更 //新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。 } glfwTerminate();//释放/删除之前的分配的所有资源 return 0; } //当用户改变窗口的大小的时候,视口也应该被调整。 //我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。 //这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。 //每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。 void framebuffer_size_callback(GLFWwindow* window, int width, int height) { //在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport), //这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。 //我们可以通过调用glViewport函数来设置窗口的维度(Dimension) glViewport(0, 0, width, height); //glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。 } void processInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); }