简述: 最近一直看一些公司的招聘要求,例如BTA等一线大厂,他们绝大多数都会对音视频有要求,而想要精通音视频就必须直到OpenGL等相关知识,所以笔者从今天开始,会按照OpenGL/OpenGL ES/Metal 的学习顺序连载相关知识,一点一滴的渗透进去,记录自己的学习过程,想学习到视觉开发的小伙伴可以点个小星星哦,我们一起学习.篇幅比较长,坚持就是胜利!
首先本片文章作为开山之作,当然要先了解一下OpenGL有哪些经常用到的专业名字啦,不然我们后续提到的技术名词会很陌生,这里我们先从OpenGL说起.
图形API简介
1.OpenGL(Open Graphics Library)是一个跨平台,跨编程语言的图像编程API,它将算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令.(这里解释一下为什么可以跨平台,简单来说OpenGL 是直接操控GPU的不需要跟其它打交道)
2.OpenGL ES (OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的⼦子集,针对⼿手机、 PDA和游戏主机等嵌⼊入式设备⽽而设计,去除了了许多不不必要和性能较低的API接⼝口。
3.Metal : Metal: Apple为游戏开发者推出了了新的平台技术 Metal,该技术能够为 3D 图 像提⾼高 10 倍的渲染性能.Metal 是Apple为了了解决3D渲染⽽而推出的框架(这是我们iOSer学习的重点,因为他是专门为苹果而生的,也是最难得一个,但是不要怕,难啃的骨头吃下去,我们才有成就感嘛)
那我们学习了这些API可以干什么呢,我相信这是许多同学最关心的话题,可以这么说,OpenGL /OpenGL ES/ Metal 在任何项⽬目中解决问题的本质 就是利用GPU芯⽚来⾼效渲染图形图像.图形API 是iOS开发者唯⼀接近GPU的⽅方式,可以这么说音视频,手机屏幕显示离不开这些东西!
OpenGL 专业名词解析
OpenGL 状态机:
状态机是理理论上的⼀种机器.这个⾮常难以理解.所以我们把这个状态机这么理解.状态机描述了了⼀个对象在其⽣命周期内所经历的各种状态,状态间的转变,发⽣转变的动因,条件及转变中所执⾏行的活动。或者说,状态机是 ⼀种行行为,说明对象在其⽣命周期中响应事件所经历的状态序列以及对那些状态事件的响应。因此具有以下特点:
1.有记忆功能,能记住当前的状
2.可以接收输入,根据输入的内容和⾃己的原先状态,修改⾃己当前状 态,并且可以有对应输出
3.当进⼊特殊状态(停机状态)的时候,便不再接收输⼊,停⽌工作
说的是什么啊,太难懂了,好的我翻译下
1.OpenGL可以记录⾃自⼰己的状态(如当前所使⽤用的颜⾊色、是否开启了了混和功能等)
2.OpenGL可以接收输入(当调用OpenGL函数的时候,实际上可以看成 OpenGL在接收我们的输入),如我们调用glColor3f,则OpenGL接收到 这个输入后会修改⾃己的“当前颜⾊”这个状态
3.OpenGL可以进⼊停止状态,不再接收输⼊。在程序退出前,OpenGL总 会先停⽌工作的
渲染:将图形/图像数据转换成3D空间图像操作叫做渲染(Rendering).
顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
顶点指的是我们在绘制⼀个图形时,它的顶点位置数据.⽽这个数据可以直接存储在数组中或者将其缓存到GPU内存中
画图⼀般是先画好图像的⻣骨架,然后再往⻣架里面填充颜色,这对于 OpenGL也是⼀样的。顶点数据就是要画的图像的⻣架,和现实中不不同的 是,OpenGL中的图像都是由图元组成。在OpenGLES中,有3种类型的图元:点、线、三⻆角形。那这些顶点数据最终是存储在哪里的呢?开发者可以选择设定函数指针,在调⽤绘制⽅的时候,直接由内存传⼊入顶点数据,也就是说这部分数据之前是存储在内存当中的,被称为顶点数组。⽽性能更高的做法是,提前分配⼀块显存,将顶点数据预先传⼊到显存当 中。这部分的显存,就被称为顶点缓冲区
管线:在OpenGL 下渲染图形,就会有经历一个一个节点.⽽这样的操作可以理解为管线.⼤家可以想象成流⽔线.每个任务类似流水线般执行.任务之间有先后顺序. 管线是一个抽象的概念,之所以称之为管线是因为显卡在处理数据的时候是按照 ⼀个固定的顺序来的,⽽且严格按照这个顺序。就想富士康的工作流水线,步骤是不能乱的! (总结:这是一个面向过程,管线== 工厂生产线一个个步骤)
固定管线/存储着⾊色器器
在早期的OpenGL 版本,它封装了了很多种着色器程序块内置的⼀段包含了了光 照、坐标变换、裁剪等诸多功能的固定shader程序来完成,来帮助开发者 来完成图形的渲染. ⽽开发者只需要传⼊相应的参数,就能快速完成图形的 渲染. 类似于iOS开发会封装很多API,⽽我们只需要调用,就可以实现功能.不需要关注底层实现原理(固定管线开放接口少就导致可自定义部门少,从而在图形处理上有局限性,所以现在已经淘汰了)
但是由于OpenGL 的使⽤场景很丰富,固定管线或存储着⾊色器器无法完成每⼀ 个业务.这时将相关部分开放成可编程
着⾊器程序Shader
常用的着色器主要有顶点着色器(VertexShader),⽚元着色器 (FragmentShader),我们后续学习的内容离不开这两个东西,是我们学习的重点.
我们先了解一下这两个着色器是用来干嘛的:
顶点着色器(VertexShader)⼀般⽤用来处理理图形每个顶点变换(旋转/平移/投影等,例如一个支架,顶点着色器就是它的支撑点,他的支撑点移动的话,整个支架也就自然而然的跟着移动了)
顶点着⾊器是OpenGL中⽤于计算顶点属性的程序。顶点着色器是逐顶点运 算的程序,也就是说每个顶点数据都会执⾏一次顶点着⾊器,当然这是并⾏的,并且顶点着⾊器运算过程中不能访问其他顶点的数据.
⽚元着色器 (FragmentShader)一般⽤来处理图形中每个像素点颜色计算和填充
⽚元着⾊器是OpenGL中⽤于计算⽚段(像素)颜色的程序。⽚元着色器是 逐像素运算的程序,也就是说每个像素都会执行一次⽚元着⾊器,当然也 是并⾏的.这个很容易理解,意思就是假如一张1024x1024宽高的图片,那么它将会执行10124x1024次片元着色器程序!(是不是很多啊!这么庞大的计算是谁来做的呢?我们后续会提到).
光栅化Rasterization/纹理
这两个词语相信在我们的日常开发中也接触过不少,他们具体是什么?做了什么东西?在图像渲染中对自己定位是什么?下面我们先了解下光栅化: