目录
- 前言
- OpenGL是什么
- 依赖的库
-
- GLEW
- freeglut
- glm
- 开发环境
-
- visual studio
- vcpkg
- 小结之环境配置
- 使用vcpkg安装c++库
- 你好!窗口
- 总结
前言
来开坑了。。。快进到挖坑不填
怎么说呢?感觉学校教的图形学,有点囫囵吞枣的感觉,害得课后自己琢磨琢磨才能玩明白。
还有一个原因是现在网上到处都是各种OpenGL的博客,但是大多都是引了一堆头文件,一顿操作,代码很多。过度的封装,导致我根本不知道其代码实现逻辑。
前几天我想实现一个shadowmapping,都要查半天的资料,看一堆博客,导致学习体验很不好。。。于是自己开坑记录下自己学习的过程。
代码方面,我尽量保证 每篇博客有且仅有一个 .cpp 文件,争取做到复制即可运行。(快进到自己骂自己:”🐖β吧我是“
OpenGL是什么
参考:https://www.khronos.org/opengl/wiki/
OpenGL,世界上最阴间的API ,可以理解为一组包含操作图像图形的函数的API,但是其实它是一个规范,为了跨平台而制定,不同的平台,都需要按照这一规范进行实际的开发。
依赖的库
我们基于c++进行OpenGL的学习,本章节介绍c++中OpenGL编程所必要的库。如同深度学习有tensorflow,后台服务有node.js。通过c++实现图形学编程,也需要有库帮助我们。
需要的库一共有三个,他们分别是:
- freeglut
- GLEW
- glm
下面单独介绍下:
GLEW
参考:http://glew.sourceforge.net/basic.html
因为OpenGL负责指定规范,而显卡厂商负责在其驱动程序中实现这些接口。那么不同的厂商对于OpenGL标准的实现和扩展都不同。
引自:https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/02%20Creating%20a%20window/
所以我们需要一个能够发现并且加载这些接口的库。
freeglut
参考:http://freeglut.sourceforge.net/docs/api.php
显示图形,首先必须有窗口。因为在不同平台下,窗口的控制不尽相同,OpenGL有意将这些操作抽象出来,以便跨平台实现OpenGL。
在c++下,比较流行的窗口控制的库就是freeglut了,它允许我们创建OpenGL上下文,并且处理用户的各种输入,比如鼠标或者是键盘等等,提供一个 “交互式” 的开发环境。
glm
参考:http://glm.g-truc.net/0.9.8/api/index.html
说到图形学就不得不提各种矩阵,向量运算。而我们cpu要向GPU传递数据,就必须用到矩阵,向量等类型,而这些类型是c++ STL所不具备的,于是我们需要glm库作为拓展。
线性代数老师:还就内个逮到!
开发环境
介绍主要的开发环境及其工具。
visual studio
说到c++编程,就不得不提我们的开发环境了。微软为我们提供了一个方便的解决方案 — visual studio
visual studio 具有管理大型c++工程的能力,并且提供良好的debug和release,此外,vs community 是免费使用的!
在其 官网 可以快速的开始下载
vcpkg
此外,和任何包依赖的语言一样(比如python的pip或者node.js的npm),我们也需要对应的包管理工具,这个工具叫 vcpkg。
在其 官方网站 也可以快速找到安装的门路。
⚠
vcpkg 需要 git 的支持。请将 git 加入环境变量。此外,vcpkg还需要用到 cmake,如果没有安装,将会自动安装。
小结之环境配置
一图流。。。
总之就是。。。唔。。。我们需要安装 ⑤ 样东西:
- visual studio
- vcpkg
其中三个c++库(GLEW,freeglut,glm)我们通过 vcpkg 来进行安装。
使用vcpkg安装c++库
假设我们已经成功安装vcpkg,那么我们在 power shell 或者 cmd 中运行命令:
vcpkg install xxx
即可安装对应的包。假如安装过程很卡,一直下载不下来,比如:
我们就可以手动用浏览器访问上图中画红框的地址并且手动下载(你可以爬梯什么的)
我们以安装glm库为例:首先我们复制下载好的文件到 downloads 目录
然后先正常启动一次 vcpkg install 命令,发现 temp 文件夹里面有一个临时文件,我们把下载好的文件重命名成这个名字,然后丢进temp目录。
我们打开 power shell,然后再次执行 install 命令
⚠
我这里安装 glm 包,必须指定x86的版本,否则vs找不到路径,目前原因不明,可能是vcpkg默认的include路径就是x86路径
最好同时安装 x86 和 x64 的版本。。。
运行命令查看是否安装成功:
最后一步:我们运行命令,将 vcpkg 聚合到 visual studio,注意需要管理员权限
vcpkg integrate install
出现绿色字体说明聚合成功!
你好!窗口
安装完毕。我们开始进行OpenGL的第一个编程。我们创建一个窗口,但是不绘制任何东西(只是为了验证)
首先使用 visual studio 创建工程:
dddd
dddd
随后我们编写 main 函数,我们测试安装的三个库是否都能够顺利运行。下面是代码:
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <glm/glm.hpp>
// 显示回调函数 -- 咱啥也不做
void display()
{
}
int main(int argc, char** argv)
{
// ---- freeglut测试 ----//
glutInit(&argc, argv); // glut初始化
glutInitDisplayMode(GLUT_RGBA); // 显示模式 -- RGBA
glutInitWindowSize(512, 512); // 窗口大小
glutCreateWindow("hello window"); // 标题
glutDisplayFunc(display); // 设置显示回调函数 -- 每帧执行
glutMainLoop(); // 进入主循环
// ---- GLEW测试 ----//
GLuint vao;
glGenBuffers(1, &vao); // 创建顶点数组对象
glBindVertexArray(vao); // 绑定vao
// ---- glm测试 ----//
glm::vec3 myColor(1.0, 0.5, 0.2); // 创建三维向量
glm::mat4 myMatrix(); // 创建矩阵
return 0;
}
严格意义上来说,这段代码的逻辑是错的。但是如果我们能够通过编译并且运行产生一个纯白的窗体,说明我们环境配置成功!
总结
肝了一晚上,👴去睡了。俗话说万事开头难,OpenGL环境的配置是最搞心态的。但是我们仍然跌跌撞撞的完成了(当然中间会遇到很多的问题 Orz)