OpenGL是Open Graphics Library 的缩写,是一组图形绘制的api集合,大约有350个函数左右,经常使用于CAD、虚拟现实、科学可视化程序和电子游戏开发以及图片和视频的滤镜处理等场景。OpenGL规范描述了绘制2D和3D图形的抽象API,虽然这些API彻底能够经过软件实现,但它是为大部分或所有使用硬件加速而设计的。各类图形API的做用本质就是使用GPU芯片高速渲染图形,得益于GPU的计算能力。而图形API也是iOS惟一可以接近GPU的地方。算法
为了能够在从此的OpenGL/Open GL ES / Metal等学习中,能够更加清楚处理过程,必须对其中的一些专业名词进行理解和消化。编程
在应用程序调用OpenGL任一API以前都会先初始化一个上下文,这是OpenGL的命令基础。由于用来记录OpenGL中的各个对象以及状态,也被称为状态机。api
OpenGL中的函数都是相似C的面向过程的,其本质是经过上下文这个庞大的状态机进行修改某个状态或者某个对象,前提都是须要把对象设为当前对象。经过封装OpenGL函数,能够实现面向对象的图形API。数组
因为上下文是个庞大的状态机,在多个模块的渲染中,能够在不一样的线程建立不一样的上下文,上下文间共享文理、缓冲区资源等。能够减小上下文的切换和修改渲染状态带来的巨大资源损耗。网络
状态机是理论上的一种的机器。状态机能够说是一种行为,记录了对象在其生命周期内中的各类状态序列,以及状态事件的响应。状态机有如下特色:架构
①有记忆功能,能够记忆当前状态。函数
②能够根据输入的值和以前的值计算后进行修改。性能
③在某些状态(停机)时,没法接收输入,中止工做。学习
OpenGL程序退出以前,老是会先中止工做的。编码
将图像/图像数据转换成3D空间图像的操做。
OpenGL中图形都是由图元组成,而图元则是由顶点组成。在OpenGL中经常使用有七种图元,在OpenGL ES中只有三种图元:点、线、三角形。
在二位图像中,每一个点都含有颜色,深度,纹理信息,将该点和相关信息称为片元。1片元对应着1像素,只是片元含有的信息更多。
全部图元都是由顶点组成的,有时一个图元由几个点组成,常常会用到顶点数组,保存在内存中或者顶点缓冲区中。
顶点数据存放在内存中,也能够存储在顶点缓冲区中。存放在内存中就是绘制的时候调用绘制函数,传入顶点数据,就会存储在内存中;性能更高的是先分配一块显存,预先把顶点存到显存中,这一块显存被称为顶点缓冲区。
OpenGL渲染图形中,能够有多个处理单元并行执行加快执行速度,其具体过程相似于工厂中的流水线。
在早期的版本中,固定管线是封装了许多着色器程序模块,包含了坐标转换、裁切、旋转变换等功能的模块程序,帮助开发者只需调用函数,传入指定的着色器程序和其余参数便可获得想要的结果。其实能够说是一个封装的接口模块。
由于固定管线/着色器没法一一包含全部freestyle的功能,这时将相关部分变成可编程的部分。
将固定管线架构的一部分变成了可编程渲染管线。实际在绘制的过程当中须要传入一个指定着色器程序的参数。常见的着色器程序有:
顶点着色器(VertexShader)
片元着色器(FragmentShader)、像素着色器(PixelShader,DirectX的叫法)、片元着色器(这三种着色器描述的都是同一种着色器,叫法不一样)
几何着色器(GeomtryShader)
曲线细分着色器(TessellationShader)
直至OpenGL ES 3.0还只支持顶点着色器和片断着色器。
OpenGL在处理着色器时,像普通程序同样通过编译、连接后生成着色器程序(glProgram)。着色器程序同时包含了顶点着色器和片断着色器的运算逻辑。OpenGL在绘制过程以下:
顶点着色器是Open GL计算顶点属性的程序,包括旋转、平移、缩放等运算。
片断着色器是OpenGL中逐像素进行并行计算每一个片断(像素)的颜色和填充的程序,还有别名:片断着色器、像素着色器。
OpenGL 着色语言(Open GL Shadering Language),用在Open GL着色的编程的语言。是开发人员编写的短小自定义的程序,他们在图形处理单元(Graphic Processor Unit,GPU)中执行。GLSL代替了固定管线的步骤的一部分,变得能够自定义编程,使得固定管线的不一样层次具备可编程性。
GLSL的着色器分为两个部分:顶点着色器和片断着色器。
把物体的数学描述和物体相关的颜色信息转换成屏幕上的对应像素和颜色填充,这个过程被称为光栅化。这个过程就是从模拟信号到离散信号的过程,过程产生的就是片元。光栅化就是把顶点数据转换成片元的过程。片元每一个元素都对应着帧缓冲区的一个像素。
光栅化的本质是把几何图元转换成二维图像的过程。该过程包含两个过程:
①决定窗口中哪些整型栅格化区域是被图元占据的
②分配一个颜色值和深度到各个区域。
在OpenGL中渲染图形时,有时为了使场景更加逼真,会使用图片编码后进行填充(能够理解成贴图,即每一个像素都从图片中获取后进行填充,再也不使用单纯的颜色填充)。这个图片在OpenGL中被称为纹理。
像素的颜色将会和帧缓冲区中颜色附着的颜色进行混合。混合算法能够经过函数进行指定,若是想实现更加复杂的算法,能够经过片断着色器进行计算,可是这样的性能会比原生的混合算法差一些(排除大牛的手法)。
数学线性代数的一个概念。图形发平生移、旋转、缩放就须要用到变换矩阵。
把3D坐标转换成2D坐标,实际的线条也使用二维坐标下进行绘制。
渲染缓冲区通常映射的是系统的资源好比窗口。若是将图像映射到窗口对应的缓冲区,那么图像将会显示到屏幕中。