所需软件
Visual Studio 2017
在微软的官网下载VS 2017
测试过使用2019版本会造成一些系统和库位数不同导致的错误
GLFW
GLFW 是配合OpenGL 使用的轻量级工具程序库,缩写自Graphics Library Framework。GLFW 的主要功能是创建并管理窗口和OpenGL 上下文,同时还提供了处理手柄、键盘、鼠标输入的功能。
在官网下载64位最新版即可
CMAKE
CMake 是一个工程文件生成工具。用户可以使用预定义好的 CMake 脚本,
根据自己的选择(像是 Visual Studio, Code::Blocks, Eclipse)生成不同 IDE 的工
程文件。用来适应不同的PC环境。
在官网下载Windows win32-x86 ZIP,32位的版本
GLAD
因为 OpenGL 只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于 OpenGL 驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,代码非常复杂,而且很繁琐,我们还需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程,其中 GLAD 是目前最新,也是最流行的库。
在线下载:https://glad.dav1d.de/
语言(Language)设为 C/C++ ;
- API 中 gl 版本指的是 OpenGL 的版本,选择 3.3 以上(因为 3.3及之后的版本是纯可编程管线,去掉了固定管线),这里我选择最新的 4.6;
- 模式(Profile)设为 Core ;
- 这里有两种选择 :Compatibility 和 Core ,其中 Compatibility 兼容旧版本,包含低版本中的 API ,而Core 是只包含当前版本必须支持的 API ,不考虑向下兼容旧版本,更为轻巧。
- 确保勾选了 Generate a Loader ,然后点击 GENERATE 。
- 在生成页面中下载 glad.zip 压缩包。
搭建流程
- 安装VS 2017,勾选C++桌面开发包
- 解压GLFW、CMAKE、GLAD压缩包。
- 在Cmake文件夹中,打开bin,打开cmake-gui
- 用VS打开Build文件夹中的GLFW.sln,在菜单栏里选择 生成-生成解决方案。
- 在磁盘中新建一个OpenGL的文件夹,包含“include”和“lib”两个文件夹
- 将 \Build\src\Debug 中的glfw3.lib,复制进OpenGL中的lib文件夹里
- 将GLFW解压出的文件夹里的include文件夹替换OpenGL文件夹的include
- 将GLAD解压出的文件夹的include文件夹导入OpenGL文件夹的include
项目配置
- 创建一个新的vs C++ 空文件 项目
- 将GLAD中的glad.c文件添加到项目源文件中
- 配置项目属性,引入库和头文件
测试
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
int main()
{
//初始化GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//MacOS环境中应该添加的代码
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
//检测当前使用的GLWF版本号
int Major, Minor, Rev;
glfwGetVersion(&Major, &Minor, &Rev);
printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
//创建一个窗口对象,存放了所有和窗口相关的数据,并且会被GLFW的其他函数频繁用到
GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//GLAD是用来管理OpenGL的函数指针,初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
//渲染窗口的尺寸大小,视口Viewport
glViewport(0, 0, 800, 600);
//调整窗口大小的时候改变视口的大小
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//渲染循环
while (!glfwWindowShouldClose(window))
{
//输入
//背景色变成蓝色
glClearColor(0.0f, 0.34f, 0.57f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//渲染指令
//检查并调用事件,交换缓冲
glfwSwapBuffers(window);
glfwPollEvents();
}
//渲染循环结束后正确释放/删除之前的分配的所有资源
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
如果出现了蓝色的渲染窗口那环境便搭建成功。
可能出现的错误
-
模块计算机和目标计算机的位数不匹配——有可能是vs版本,cmake版本的选择的问题(把2019换成2017解决了)
-
无法打开或查找PDB文件——菜单栏-测试-选项-调试-符号-【仅加载指定的模块】
禁用符号加载
-
如果你现在编译你的 cpp 文件会得到大量的 undefined reference (未定义的引用)错误,也就是说你并未顺利地链接GLFW 库。
——根据mooc万琳老师的《计算机图形学》实验指导文档+自己实践整理