当初接触OpenGL的时分,也重视到了苹果爸爸弃用的问题,心里想着,苹果爸爸都弃用了OpenGL/Open LG ES,那么学这东西还有什么用呢?

OpenGL/OpenGL ES 入门:图形API以及专业名词解析

值得注意的是:
1、苹果本身的体系迁移到Metal是花费了4年时间
2、在没有推出Metal时,苹果对于OpenGL ES是高度集成且配合相应图层和GLKit来辅助开发者能快速运用OpenGL ES
3、OpenGL ES的弃用,仅仅针对苹果内部体系底层API依赖而言,并不是想让iOS开发者从此不运用OpenGL ES。仅仅人物变成了第三方,究竟它的跨渠道以及稳定是很难让现有的开发抛弃,而这几点Metal现在很难做到
4、现在大多数类似百度地图、高德地图和音视频处理的项目组现已很巨大了,暂时不会迁移到Metal,所以只学习Metal是不够用的
5、所以学习需求一步一步的走OpenGL -> OpenGL ES -> Metal,这个也是亲身体会,之前测验过上来就学GPUImage或许是OpenGL ES,可是仅仅停留在会用,可是不知道原理,所以先要打好根底

本篇文章的意图

  • 快速了解图形API
  • 快速了解OpenGL下专业名词

图形API

图形API简介

  • OpenGL(Open Graphics Library):是一个跨编程言语、跨渠道的编程图形程序接口,它将核算机的资源抽象称为一个个OpenGL的目标,对这些资源的操作抽象为一个个的OpenGL指令。
  • OpenGL ES(OpenGL for Embedded Systems):是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而规划的,去除了许多不用要和功能较低的API接口。
  • DirectX:是由许多API组成的,DirectX并不是一个单纯的图形API。最重要的是DirectX是归于Windows上一个多媒体处理API。并不支撑Windows以外的渠道,所以不是跨渠道结构。依照性质分类,可分为四大部分,显现部分、声响部分、输入部分和网络部分。
  • Metal:Apple为游戏开发者推出了新的渠道技能,该技能能够为3D图画提高10倍的烘托功能。Metal是Apple为处理3D烘托而推出的结构

图形API的意图是处理什么问题

简略的说便是完结图形的底层烘托

  • 比方在游戏开发中,对游戏场景/游戏使命的烘托
  • 比方在音视频开发中,对于视频解码后的数据烘托
  • 比方在地图引擎,对于地图上的数据烘托
  • 比方在动画中,完结动画的制作
  • 比方在视频处理中,对于视频加上滤镜效果

实质:便是利用GPU芯片来高效烘托图形图画 图形API是iOS开发者唯一接近GPU的办法

OpenGL下专业名词解析

OpenGL上下文 context

  • 在应用程序调用任何OpenGL的指令之前,需求先创立一个OpenGL的上下文context。这个上下文是一个非常巨大的状况机,保存了OpenGL中的各种状况,这也是OpenGL指令履行的根底
  • OpenGL的函数不论在哪个言语中,都是类似C言语相同的面向进程的函数,实质上都是对OpenGL上下文这个巨大的状况机中的某个状况或许目标进行操作,当然你得首先把这个目标设置为当时目标。因而,经过对OpenGL指令的封装,是能够将OpenGL的相关调用封装成为一个面向目标的图形API
  • 因为OpenGL上下文是一个巨大的状况机,切换上下文往往会产生较大的开支,可是不同的制作模块,或许需求运用彻底独立的状况办理。因而,能够在应用程序中分别创立多个不同的上下文,在不同线程中运用不同的上下文,上下文之间共享纹路、缓冲区等资源。这样的计划,会比重复切换上下文,或许大量修正烘托状况愈加合理高效

OpenGL 状况机

  • 状况机理论上是一种机器,它描绘了一个目标在其生命周期内所阅历的各种状况,状况间的改变、发送改变的动因、条件以及改变中所履行的活动。或许说,状况机是一种行为,即目标在其生命周期中呼应事情所阅历的状况序列以及对那些状况事情的呼应。具有一下特色:

    • 有记忆功能,能够记住当时的状况
    • 能够接纳输入,依据输入的内容和自己的原先状况,修正自己当时状况,而且能够有对应输出
    • 当进入特别状况(停机状况)的时分,便不再接纳输入,即中止作业
  • 电脑能够说便是典型的状况机

    • 电脑的存储器(内存、硬盘等),能够记住电脑自己当时的状况(当时暗转在电脑中的软件、保存在电脑中的数据、电脑当时的设置等,其实都是二进制的值,都归于当时的状况)
    • 电脑的输入设备接纳输入(键盘、鼠标、文件输入),依据输入的内容和自己的状况(主要指能够运转的程序代码),修正自己的状况(修正内存中的值),而且能够得到输出(将成果显现到屏幕)
    • 当它进入到特别状况(关机状况)的时分,便不再接纳输入,中止作业
  • 类推到OpenGL中,能够这么了解

    • OpenGL能够记录自己的状况(如当时所运用的色彩、是否开启了混合功能等)
    • OpenGL能够接纳输入(调用OpenGL函数时,能够了解成OpenGL在接纳输入),如调用glColor3f,即OpenGL接纳到这个输入后,会修正自己的“当时色彩”这个状况
    • OpenGL能够进入中止状况,不再接纳输入。在程序退出前,OpenGL总会先中止作业

OpenGL是一个状况机,它坚持本身的状况,除非用户输入一条指令让它改变状况

烘托

将图形/图画数据转换成3D空间图画操作叫做烘托Rendering

极点数组VertexArray和极点缓冲区VertexBuffer

  • 极点: 指的是在制作一个图形时,它的极点方位数据,而这个数据能够直接存粗在数组中或许将其缓存到GPU内存中
  • OpenGL中的图画都是由图元组成,在OpenGL ES中,有3种类型的图元:点、线、三角形。开发者能够挑选设定函数指针,在调用制作办法的时分,直接由内存传入极点数据,也便是说这部分数据之前是存储在内存当中的,被称为极点数组。而功能更高的做法是提早分配一块显存,将极点数据预先传入到显存当中,这部分的显存,就被称为极点缓冲区

管线

  • 管线:能够了解为烘托流水线。实践上指一堆原始图形数据途径一个运送管道,期间经过各种变化处理终究出现在屏幕的进程。
  • 在OpenGL下烘托图形,就会阅历一个一个节点。而这样的操作能够了解为管线。能够想象成流水线,每个使命类似流水线相同履行,使命之间有先后次序。之所以称之为管线是因为显卡在处理数据的时分是依照一个固定的次序来的,而且严厉依照这个次序。就像水从一根管子的一端留到另一端,这个次序不能打破。
  • 固定管线:简略了解为烘托图画这个进程,咱们只能经过调用GLShaderManager类的固定管线效果完结一系列的上色器处理。
  • 可编程管线:简略了解为在处理图形的进程,咱们能够运用自定义极点上色器和片元上色器的进程。因为OpenGL的运用场景非常丰富,固定管线或许存储上色器无法完结每一个使命,这时将相关部分开放成可编程

上色器程序Shader

  • 将固定烘托管线架构变成为可编程烘托管线。因而,OpenGL在实践调用制作函数之前,还需求指定一个由shader编译成的上色器程序。常见的上色器主要有极点上色器(VertexShader)、片段/片元上色器(FragmentShader)/像素上色器(PixelShader)、几何上色器(GeometryShader)、曲面细分上色器(TessellationShader)。直到OpenGL ES3.0,仍然只支撑了极点上色器和片段上色器这两个最根底的上色器
  • OpenGL在处理shader时,和其他编译器相同。经过编译、链接等进程,生成了上色器程序(glProgram),上色器程序同时包含了极点上色器和片元上色器的运算逻辑。在OpenGL进行制作的时分,首先由极点上色器对传入的极点数据进行运算。在经过图元安装,将极点转换为图元。然后进行光栅化,将图元这种矢量图形,转换为栅格化数据。最后,将栅格化数据传入片元上色器中进行运算。片元上色器会对栅格化数据中的每一个像素进行运算,并决议像素的色彩。

极点上色器VertexShader

  • 一般用来处理图形每个极点改换(旋转/平移/投影等)
  • 极点上色器时OpenGL中用于核算极点特点的程序。极点上色器是逐极点运算的程序,也便是说每个极点数据都会履行一次。当然这是并行,而且极点上色器运算进程中无法访问其他极点数据
  • 一般来说典型的需求核算的极点特点主要包含极点坐标改换、逐极点光照运算等等。极点坐标由本身坐标系转换到规范化坐标系的运算,便是在这里产生的

片元上色器FragmentShader

  • 一般用来处理图形中每个像素点色彩核算和填充
  • 片元上色器是OpenGL中用于核算片段(像素)色彩的程序,片元上色器是逐像素运算的程序,也就说每个像素都会履行一次片元上色器,当然也是并行的

GLSL (OpenGL Shading Language)

OpenGL上色言语是用来在OpenGL中上色编码的言语,也便是开发人员写的矮小的自定义程序,他们是在GPU(Graphic Processor Unit图形处理单元)上履行的,替代了固定的烘托管线的一部分,使烘托管线中不同层次具有可编程性。
GLSL的上色器代码分成2个部分: VertexShader(极点上色器) 和 Fragment Shader(片元上色器)

光栅化 Rasterization

  • 光栅化便是把极点数据转换为片元的进程。具有将图转化为一个个栅格组成的图画的效果。片元中的每一个元素对应于帧缓冲区的一个像素
  • 光栅化其实是一种将几何图元变为二维图画的进程。该进程包含了两部分的作业。第一部分作业:决议窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分作业:分配一个色彩值和一个深度值到各个区域。光栅化进程产生的是片元
  • 把物体的数学描绘以及与物体相关的色彩信息转换为屏幕上用于对应方位的像素以及用于填充像素的色彩,这个进程称为光栅化,这是一个将模拟信号转化为离散信号的进程

纹路

纹路能够了解为图片。在烘托图形时需求在其编码填充图片,为了使得场景愈加传神,而这里运用的图片,便是常说的纹路。在OpenGL中,愈加习气叫纹路,而不是图片。

混合 Blending

  • 在测验阶段之后,假如像素仍然没有被剔除,那么像素的色彩将会和帧缓冲区中色彩附着上的色彩进行混合。混合的算法能够经过OpenGL的函数进行指定。可是OpenGL提供的混合算法有限的,假如需求愈加复杂的混合算法,一般能够经过像素上色器进行完结,当然功能会比原声的混合算法差一些
  • 混合便是把两种色彩混在一同。详细一点,便是把某一像素方位原来的色彩和将要画上去的色彩,经过某种办法混在一同,然后到达特别的效果

改换矩阵 Transformation

图形想产生平移、缩放、旋改改换,就需求运用改换矩阵

投影矩阵 Projection

用于将3D坐标转换为二维屏幕坐标,实践线条也将在二维坐标下进行制作

烘托上屏/交流缓冲区 SwapBuffer

烘托缓冲区一般映射的是体系的资源,比方窗口。假如将图画直接烘托到窗口对应的缓冲区,则能够将图画显现到屏幕上。可是,值得注意的是,假如每个窗口只要一个缓冲区,那么在制作进程中,屏幕进行了改写,窗口或许显现出不完整的图画。

常规的OpenGL程序至少都会有两个缓冲区。显现在屏幕上的称为屏幕缓冲区,没有显现的称为离屏缓冲区。在一个缓冲区烘托完结之后,经过将屏幕缓冲区和离屏缓冲区交流,完结图画在屏幕上显现。

因为显现器的改写一般是逐行进行的,因而为了防止交流缓冲区的时分,屏幕上下区域的图画分归于两个不同的帧,因而交流一般会等待显现器改写完结的信号,在显现器两次改写的间隔中进行交流,这个信号就被称为笔直同步信号,这个技能被称为笔直同步

运用了双缓冲区和笔直同步技能之后,因为总是要等待缓冲区交流之后再进行下一帧的烘托,使得帧率无法彻底到达硬件允许的最高水平,为了处理这个问题,引入了三缓冲区技能,在等待笔直同步时,来回交替烘托两个离屏的缓冲区,而笔直同步产生时,屏幕缓冲区和最近烘托完结的离屏缓冲区交流,完结充分利用硬件功能的意图