OpenGL学习总结(一)

OpenGL基础

一、OpenGL是一个状态机
OpenGL本身是一个巨大的状态机,所以编程的根本目的使用一些列操作和变量来改变OpenGL的工作状态,例如:要绘制一个三角形的时候,我们先要告诉它接下来将要绘制三角形,使其切换状态,然后再将要绘制的三角形的坐标告诉它,随后才可以绘制三角形。再比如:要对显存进行操作,我们要先绑定需要操作的显存,然后接下来的操作就都会默认为是对已绑定显存的操作,当我们操作完毕后就需要解绑,使其恢复到原来的工作状态。

二、搭建OpenGL工作环境
1、GLFW
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
首先:我们需要从官网下载GLFW源代码包,网站如下:http://www.glfw.org/download.html。
然后:我们需要用到CMake来把下载好的源代码生成为工程文件。
最后:运行工程文件能够得到glfw的.lib文件,将其放在E:\VS2015\VC\lib中即可。然后将源代码包中include文件夹下的头文件放在E:\VS2015\VC\include即可。
使用:在VS中右键项目找到属性然后是链接器->输入->附加依赖项将glfw3.lib添加进去。编程时添加:

#include 

2、GLEW
OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。GLEW是OpenGL Extension Wrangler Library的缩写,它能解决我们上面提到的那个繁琐的问题。
GLEW的搭建与使用方法同GLFW,最后的附加依赖项为glew32s.lib。编程时添加:

#define GLEW_STATIC
#include 

3、SOIL
SOIL是简易OpenGL图像库(Simple OpenGL Image Library)的缩写,它支持大多数流行的图像格式,使用起来也很简单,你可以从他们的主页:http://www.lonesock.net/soil.html下载。像其它库一样,你必须自己生成.lib。
附加依赖项为SOIL.lib。编程时添加:

#include 

4、Assimp
Assimp,全称为Open Asset Import Library。Assimp可以导入几十种不同格式的模型文件(同样也可以导出部分模型格式)。只要Assimp加载完了模型文件,我们就可以从Assimp上获取所有我们需要的模型数据。Assimp把不同的模型文件都转换为一个统一的数据结构,所有无论我们导入何种格式的模型文件,都可以用同一个方式去访问我们需要的模型数据。
下载网址:http://assimp.sourceforge.net。该网址需要挂VPN,推荐使用天行VPN或者GREENVPN,他们俩每天都有一小时免费试用。
Assimp的搭建方式同上述三个库,需要注意的是它不仅仅有一个.lib文件还有一个.dll文件,.dll文件我们需要把它放在你运行程序时产生的.exe文件的目录当中。

三、常见的OpenGL基本概念
1、顶点缓冲对象VBO:一个调用显存并存储所有顶点数据供显卡使用的缓冲对象。
VBO归根到底是显卡存储空间里的一块缓存区(Buffer)而已,这个Buffer有它的名字(VBO的ID),OpenGL在GPU的某处记录着这个ID和对应的显存地址(或者地址偏移,类似内存)。
2、顶点数组对象VAO:存储缓冲区和顶点属性状态。用一张图来解释一下:
OpenGL学习总结(一)_第1张图片
引用知乎某回答来形象的解释一下:
OpenGL在画画的时候,要用到很多的信息,如顶点的坐标、纹理、颜色等等…. 假如一个顶点包含了坐标和颜色的信息,那么这个顶点处的数据格式可能如下:
x, y, z, r, g, b
这些值会被存储在一个叫VBO (vertex buffer object)的地方。
因而,可以把VBO理解成一个数据区域,这里面存放了渲染所需要的一切信息。但需要注意的是,数据在VBO里面的时候,OpenGL是并不知道这里面的每个数据所代表的具体含义的,只是一堆数值罢了。
这时候,VAO(vertex array object)就派上用场了。
VAO指定了读取VBO的方式~~

假如VBO里面现在存放了如下的内容:
x0, y0, z0, r0, g0, b0
x1, y1, z1, r1, g1, b1
x2, y2, z2, r2, g2, b2

VAO可以定义一种格式说,我每次只取VBO里面的x,y,z的值;也可以定义一种格式说,每次只取VBO里面的r,g,b的值。这样我们就可以在渲染的时候,绑定不同的VAO,实现按照不同的格式将VBO里面的东西渲染出来~

作者:禾惠
链接:https://www.zhihu.com/question/30095978/answer/87995822
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

3、EBO索引缓冲对象
EBO和VBO一样,也是存储于显存中的数据,它的作用主要是告诉OpenGL如何绘制顶点,比如我们现在有9个顶点,若EBO中存储的数据是0,5,3,4,6,7则绘制的时候会按照上述顺序来绘制图形。

你可能感兴趣的:(OpenGL学习总结)