PS:
在LearnOpenGL中将采用GLFW+CMake+GLAD+VS2022来进行OpenGL的环境搭建。
本人觉得LearnOpenGL在某些步骤还是没有讲清楚,因此做此博客来给大家做个借鉴,避免一些误区。
目录
GLFW环境配置:
GLFW
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入,对我们来说这就够了。(官方描述)。
步骤:
- Download | GLFW在官网上进行下载源码包(resource packge)这边建议在D盘新建一个(命名为:OpenGL)文件夹,将所需的资源全部解压到该文件中。
解压文件留做待用......
CMake安装
CMake
CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。(官方)
步骤
- Download | CMake在官网下载二进制文件(Binary distributions)。ps:这边简单提一嘴。二进制文件(Binary distributions)时编译后的可执行文件。源文件(Source distributions)
- 是源代码文件,需要自己配置环境编译。
- 这里我们选择。
- 这里根据自己需要进行配置(懒人一键next)。
打开CMake。
- 这里将用上上述的GLFW文件(不能有中文路径!!!!!)。build文件(自己在glfw中新建文件夹)
- 点击左下角Configure。
- 然后选择自己需要的编译器点击finish就可以了。
- 最后点击Generate,将在build文件夹里面(你自己在glfw中新建的build文件夹)生成文件。
-
在build文件夹里面找到GLFW.sln文件。用vs2022打开。然后生成解决方案(Build Solution)。
- 然后在build/src/Debug文件夹内就会出现我们编译出的库文件glfw3.lib。留着备用!
接下来我们就要开始创建工程了!
-
新建一个空项目,要选c++的。
-
选成x64的。ps:x64就是六十四位的,x86是三十二位的。
-
右击解决方案选择属性!
- 选择VC++目录,这里将配置两个目录包含目录(include directories)和库目录(liberary directories)。这里先解决包含目录(include directories),点击包含目录(include directories)。
复制这个路径,打开文件夹,进入这个路径。
- 将glfw的include文件夹里面的文件放入上述的路径
新行,将下面的路径输入。
- 然后点击确认。
- 复制该路径进入文件夹。
进入
- 将glfw-build-src-debug中的lib文件复制到上面进入的文件夹中。
并把新建行将下面复制的路径放入。
- 然后确定即可。
- 最后还需要添加依赖。点击链接器(Linker)和输入(Input)将glfw3.lib自己在依赖项后面添加。点击确定即可。
GLAD
GLAD
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。
步骤
- https://github.com/Dav1dde/glad进入GLAD的GitHub页面。
-
进入到一个在线服务的页面。
Language选择C/C++,API gl选择3.3往上(你要是对你的GPU有自信,可以试着版本拉满)
-
进入到一个在线服务的页面。
Language选择C/C++,API gl选择3.3往上(你要是对你的GPU有自信,可以试着版本拉满)
- 页面往下翻,如图勾选,以及Gnerate生成
点击下载!!!!!!。
- 内部结构。
- GLAD现在应该提供给你了一个zip压缩文件,包含两个头文件目录,和一个glad.c文件。将两个头文件目录(glad和KHR)复制到你的Include文件夹中(或者增加一个额外的项目指向这些目录),并添加glad.c文件到你的工程中。
-
到此就配置完成了,接下来要运行一个窗口测试一下!
运行一个窗口
新建一个test.cpp文件。Code Viewer. Source code: src/1.getting_started/1.2.hello_window_clear/hello_window_clear.cpp
把该网站的代码粘贴过来
运行。
大功告成!
总结
本人也是初学,不过一切都是运行成功后才发出来的。不会乱教。其中对编译器的理解也不够深入,因此谢谢大家包含。
如果大家过程有问题,可以评论区留言。本文建议配合LearnOpenGL食用更佳。
大家多多点赞评论转发!谢谢观看!
测试代码以及解释。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow*, int, int);
void processInput(GLFWwindow* windows);
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main() {
glfwInit();//初始化glfw
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本号为3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本号为3
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//核心模式
#pragma region MacOS
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//向前兼容
#pragma endregion
//创建一个窗口对象
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "learnOpenGL", NULL, NULL);//创建一个窗口实例
if (window == NULL) {
std::cout << "Failed to create GLFW window"<<std::endl;
glfwTerminate();//glfw终止
return -1;
}
glfwMakeContextCurrent(window);//暂不知晓
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//每次更改窗口大小,调用framebuffer_size_callback函数。
//GLAD管理ogl函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initailize GLAD" << std::endl;
return -1;
}
//循环渲染
while (!glfwWindowShouldClose(window)) { //glfwWindowShouldClose()检查glfw是否要求被退出
processInput(window);//监听是否ESCAPE退出
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//颜色清空后 用这个颜色填充。
glClear(GL_COLOR_BUFFER_BIT);//颜色缓冲
//glClear(GL_DEPTH_BUFFER_BIT);//深度缓冲
//glClear(GL_STENCIL_BUFFER_BIT);//模板缓存
glfwSwapBuffers(window);//函数交换颜色缓冲(他是一个储存着GLFW窗口每一个像素颜色值的大缓冲),刷新显示。
glfwPollEvents();//函数检查有没有触发什么事件,更新窗口状态,并调用对应的回调函数。
}
glfwTerminate();//终止GLFW
return 0;
}
/// <summary>
/// 输入ESCAPE退出
/// </summary>
/// <param name="window"></param>
void processInput(GLFWwindow* window) {
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
glfwSetWindowShouldClose(window, true);
}
}
/// <summary>
/// 回调函数,每次改变窗口时调用,修改viewport
/// </summary>
/// <param name="window"></param>
/// <param name="witdh"></param>
/// <param name="height"></param>
void framebuffer_size_callback(GLFWwindow* window, int witdh, int height) {
glViewport(0, 0, witdh, height);
}