本篇将利用OpenGLES将2D图形绘制出来。代码地址:https://gitee.com/springflow/OpenGLES(learn1)。
1.在编写代码之前需要先了解几个概念。
本专题的所有内容都是基于OpenGLES2.0。
OpenGLES是一种软件技术,部分运行在CPU上,部分运行在GPU上。OpenGLES横跨在两个处理器之间,协调两个内存区域的之间的数据交换。但是相对于GPU的高速运算,不同内存之间的数据访问读写、复制是较慢的。为了高效发挥出GPU的性能,OpenGLES2.0抛弃了以往的低效内存复制操作的支持,引入了一个新的概念,缓存(buffers)。
缓存:提供数据的最好方式。
OpenGLES为两个内存区域之间的数据交换定义了缓存(buffers)概念。缓存是指图像处理期能够管理和控制的连续RAM,程序从CPU的内存复制数据到OpenGLES的缓存。在GPU取得一个缓存的的所有权之后,运行在CUP中的程序将不在接触这个缓存。
所有程序提供给GPU的数据都应该放在缓存中。通过以下7个步骤为缓存提供数据。(后文将添加实例代码)
1.生成(Generate):请求OpenGLES为图形处理器控制的缓存生成一个独一无二的标识符。
2.绑定(Bind):告诉OpenGLES为接下来的运算使用一个缓存
3.缓存数据(Buffer Data):为当前绑定的缓存分配并初始化足够的连续内存,将CPU中的数据复制到缓存中
4.启用(Enable)或禁止(Disable)使用缓存:告诉OpenGLES是否使用缓存来渲染
5.设置指针(Set pointers):告诉OpenGLES在缓存中的数据的类型和所需要访问的数据和内存偏移地址
6.绘图(Draw)
7.删除(Delete):删除缓存,释放内存
以上内容是OpenGLES的的缓存介绍。
2.下面介绍图像的整体绘制流程,下面将引入代码来详细说明。
我们知道所有的平面都是点构成的,两个点构成一条线,三个点构成了一个平面。在OpenGLES中也是一样,一个平面由一个或者多个三角形组成。渲染完图形框架后,在每个点上添加上颜色,就构成了我们看到图形。
在构成三角形的过程中,我们需要知道三角形各个顶点的位置,这里就引入了OpenGLES中一个重要的概念:顶点。
上面使用一张图,来展示从顶点到图像的过程
顶点数据:存放了顶点坐标、纹理坐标等。
顶点着色器:顶点数据传给着色器,用来编辑顶点信息。
顶点变换:主要是对顶点坐标,纹理坐标等进行变换,复杂的变换都是又平移、旋转、缩放组合变换而来。
图元配装:根据我们设置的绘制方式,将顶点绘制成一个个三角形。
光栅化:连接顶点的线线段用点拼接起来,三角形用点填充。
片元着色器:将所有的点填充自定义颜色或者图片纹理。
3.上面介绍了顶点,现在知道了顶点,要知道顶点的信息,必然要引入坐标系:
3.1顶点坐标系
在iPhone设备中,顶点坐标系的原点在屏幕中央。这里只使用平面坐标系。
顶点坐标系的范围是(-1,1)
3.2纹理坐标系
纹理坐标系的原点在屏幕左下角,坐标系范围是(0,1),分为s轴,t轴
了解完这些基本概念后,结合本文的代码,开始学习如何使用OpenGLES绘制第一张图像。