OpenGL从入门到精通

矩阵变换是学习OpenGL过程中最让人头大的地方,这里推荐两个小工具实现查看MODELVIEW和PROJECT两个矩阵的实时变化

matrixModelView

matrixProjection

笔者读书的时候用的是OpenGL1.*系统,相对来说比较简单,只要设置绘制的属性,直接画点就是了,后来去搞CV和深度学习了,大约有7年都没再碰过它,而最近要用OpenGL了,发现大部分都用3.*了,着色器、VBO、VAO什么的看的一头雾水, 后来花了几天时间去啃,总算是略有小成.

所谓OpenGL,也就是开放图形接口,定义了操作显卡绘制的一些函数,为上层应用提供了平台无关的实现,将游戏开发人员从繁琐的数学计算过程中解放了出来. 首先有个很重要的地方是要搞清楚CPU和GPU的区别在哪?有好几核CPU用着它不香嘛,为啥又出来个GPU?

CPU也即中央处理器,擅长处理复杂的逻辑运算,但是受限于功耗等的限制,目前主流的都只有4个核,即便Intel采用了超线程技术,也不会超过8个线程,这也就意味着同时处理不会超过8个任务,想想我们的屏幕像素都在2k了,差不多是2000*1080,哪怕一个像素绘制时间只需要1ns,整个下来的时间都会超过2s,这显然是不可接受的.GPU则是另一种设计的极端,它个每个核心都只能处理简单的运算,但是却有成百上千个核心,所以只需要一条指令,便可以同时把所有相同的任务的都给处理完。

但是有个概念务必要记牢,GPU它再厉害也只能处理位于GPU显存上的数据,而我们编写的程序数据都还在内存上呢?怎么把这些数据转移到显存呢?大量的数据传输是个很慢的过程,这么能提高效率呢?这就是glGenBuffer、glBindBuffer和glBufferData的作用了,这三个函数的作用说白了就是封装了我们把数据从内存转移到显存的操作.学过CUDA的都知道,GPU处理有单独的语言,和C语言很相似但又不完全一样,在OpenGL里也有个类似的GLSL语言,就是完成GPU计算的语言, 而这些运行在GPU的小程序就被称作着色器.

如果只是有一些控制性的变量要从CPU传到GPU呢?没错,Uniform就是用来完成这个目的的, 可以通过glGetUniformLocation获取变量在着色器种的位置,再通过glUniform4f赋值给它. 在显存里的数据如何传递给着色器呢?答案是通过glVertexAttribPointer指定其在显存中的位置及步长, 还要记得通过glEnableVertexAttribArray启用VBO. 我们的图形会有很多的定点,也会有很多的面,但是一个点会被三个三角形共享,如果每个都再重新写一遍不仅容易出错还浪费了很多空间,这时索引缓冲对象就派上用场了,这样我们只要存储顶点和组成三角形的索引就好了, 绘制EBO记得用glDrawElements.

OpenGL怎么安装和使用在网上有大量的教程,比较推荐的是学习OpenGL中文教程: LearnOpenGL

你可能感兴趣的:(CV)