文章目录
- OpenGL
- GLFW & CMake
- 链接到 Hello OpenGL!
- GLAD
- 运行测试
OpenGL
什么是 OpenGL,OpenGL 能做什么在此不再赘述
运行 OpenGL 需要准备的有:
- CMake:用于执行编译
- VS:我使用的是 Visual Studio 17 2022 版本
- GLFW:C语言库,用 VS 2022 编译、链接
- GLAD:OpenGL 的驱动层,同样需要和 VS 编译链接
GLFW & CMake
从 https://www.glfw.org/download.html 下载 GLFW 的源码
CMake 需要绑定一个 c语言 编译器,这里选择你安装的 VS 版本即可
然后解压 glfw 源码到一个文件夹
在 CMake 中选择 glfw 的源码地址和构建输出目标地址
在下面点击 Configure 和 Generate,就可以编译出 sln 工程了
随后使用 VS 2022 打开 GLFW.sln,生成解决方案,构建即可~
- 构建结束后在这个路径找到 glfw3.lib,这就是我们要的 GLFW 库文件了
- 回到 glfw 源代码文件夹,这里有个 include 文件夹,也是我们需要关注的文件
为了方便我们的 OpenGL 项目使用,我们找个地方创建一个文件夹,把东西放进去,include 直接复制到文件夹里,再创建一个 lib 文件夹把刚刚的 glfw3.lib 放进去~
链接到 Hello OpenGL!
右键点击我们的项目名称(在解决方案下面)打开属性
在这里添加:
- 包含目录(对应 include)
- 库目录(对应 lib)
在这里加上 glfw3.lib 和 opengl32.lib,别把分号忘记掉了
GLAD
GLAD 的开源生成页面在:https://glad.dav1d.de/
选好这两项,在下面点击生成即可
这就是结果源码,下载下来,把 include 导入即可
需要注意的是,src 不是库,把里面的 glad.c 放在项目里面就可以了
运行测试
然后创建一个 cpp 文件到源文件分类中,导入这两行,没问题就成功了~
实现了base.h & base.cpp,把 OpenGL 的一部分数据解耦出去了,main.cpp 负责调用运行
#include "base.h"
/// <summary>
/// 初始化 glfw 并配置参数
/// </summary>
void initGlfw() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
/// <summary>
/// 创建窗口对象, 存放了窗口相关数据
/// </summary>
/// <returns></returns>
GLFWwindow* createWindowObj() {
// todo
GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_LABEL, NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return (GLFWwindow*)-1;
}
glfwMakeContextCurrent(window);
return window;
}
int initGlad() {
// todo -> glfwGetProcAddress
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
return 1;
}
void initViewport(GLFWwindow* window) {
glViewport(0, 0, 800, 600);
glfwSetFramebufferSizeCallback(window, [](GLFWwindow* window, int width, int height) {
glViewport(0, 0, width, height);
});
}
void mainThread(GLFWwindow* window) {
while (!glfwWindowShouldClose(window))
{
// 检测输入
[](GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
};
// 渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 检查并调用事件, 交换缓冲
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
}