常见图形API简介
- OpenGL (Open Graphics Library)
- OpenGL是一个跨平台、跨语言的编程图形框架,主要用于windows、mac等PC端的图形图像渲染处理 。
- 它将计算机资源资源抽象成一个个OpenGL对象,对这些资源的操作抽象为一个个OpenGL指令。
- OpenGL ES (OpenGL for Embedded Systems)
- OpenGL ES 是OpenGL三维图像API的子集,主要是针对嵌入式设备(如手机,pad,游戏主机等)的图形处理。
- 去除了许多不必要和性能较低的接口。
- OpenCV(Open Source Computer Vision Library)
- OpenCV主要用于识别技术,例如人脸识别、身份识别、物体识别等,
- 该API的使用需要与人工智能相结合。
目前市面上用的最多的识别三方是 face++,且是收费的,支付宝等大厂的识别功能也是集成的face++
- DirectX
- DirectX是Windows平台的多媒体处理框架,不支持跨平台使用。
- 由很多API组成,并不是单一的图形API,主要分为显示、声音、输入、网络四大部分。
- Metal
- Metal是apple公司为了解决3D渲染问题而推出的框架,该技术为游戏开发者提供了新的平台。
- 该技术能够为3D图像提高10倍的渲染性能。
MacOS/iOS中的CoreGraphics、CoreAnimation、CoreImage框架在2018年(iOS12)以前是基于OpenGL ES封装的,在2018年以后是基于Metal封装的。
OpenGL ES可以利用GPU做图形图像的处理,Metal可以通过调度GPU来做自定义的事情。
图形API作用
- 图形API主要用于解决实现图形的底层渲染问题。
应用场景比如:游戏引擎开发中(cocoa2D),对游戏场景,游戏人物的渲染;
视频播放框架中(ijkplayer,kxmovie等)对视频解码后的数据渲染;
地图引擎开发中,地图数据的渲染;
coreAnimation中,对动画的旋转,缩放,移动图层特效等操作;
视频、动画的滤镜效果等……
- OpenGL / OpenGL ES / Metal在任何项目中解决问题的本质就是利用GPU芯片高效渲染图形图像。
- 图形API,是iOS开发者接近GPU的唯一方式。
OpenGL 专业名词解析
- OpenGL 上下文(context)
- 在应⽤程序调⽤任何OpenGL的指令之前,需要安排⾸先创建一个OpenGL的 上下文。这个上下⽂是一个⾮常庞⼤的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令执⾏的基础。
- OpenGL的函数,类似C语⾔一样⾯向过程的函数,本质上是对OpenGL上下⽂这个庞⼤的状态机中的某个状态或者对象进⾏操作,当然你得⾸先把这个对象设置为当前对象。因此,通过对 OpenGL指令的封装,是可以将OpenGL的相关调⽤封装成为⼀个⾯向对象的图形API。
- 由于OpenGL上下文是⼀个巨⼤的状态机,切换上下文往往会产生较⼤的开销,但是不同的绘制模块,可能需要使⽤完全独立的状态管理。因此,可以在应⽤程序中分别创建多个不同的上下文,在不同线程中使⽤不同的上下文,上下⽂之间共享纹理、缓冲区等资源。这样的方案,会⽐反复切换上下文,或者⼤量修改渲染状态,更加合理⾼效。
- OpenGL 状态机
- 状态机是理论上的⼀种机器. 状态机描述了⼀个对象在其⽣生命周期内所经历的各种状态,状态间的转变,发⽣转变的动因,条件及转变中所执⾏的活动。或者说,状态机是 ⼀种行为,说明对象在其⽣命周期中响应事件所经历的状态序列以及对那些状态事件的响应。
- 因此状态机具有以下特点:
有记忆功能,能记住其当前的状态;
可以接收输入,根据输⼊的内容和⾃己的原先状态,修改⾃己当前状态,并且可以有对应输出;
当进⼊特殊状态(停机状态)的时候,便不再接收输入,停止工作;- OpenGL 状态机的特点:
OpenGL可以记录⾃己的状态(如当前所使⽤的颜色、是否开启了混合功能等)
OpenGL可以接收输⼊(当调⽤OpenGL函数的时候,实际上可以看成 OpenGL在接收我们的输入),如我们调⽤glColor3f,则OpenGL接收到这个输⼊后会修改⾃己的“当前颜色”这个状态;
OpenGL可以进⼊停⽌状态,不再接收输入。在程序退出前,OpenGL总会先停⽌工作的;
- 渲染(Rendering)
将图形/图像数据转换成3D空间图像的操作(图片/按钮/视频等,显示绘制到屏幕的过程)。
- 顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
画图⼀般是先画好图像的⻣架,然后再往⻣架⾥面填充颜⾊,这对于 OpenGL也是⼀样的。顶点数据就是要画图像的⻣架,和现实中不同的是,OpenGL中的图像都是由图元组成。在OpenGL ES中,有3种类型的图元:点、线、三⻆形。
这些顶点数据最终是存储在哪呢?
- 顶点数据:我们在绘制图形时,其顶点位置数据。
- 顶点数组:顶点数据存储在内存数组中。
- 顶点缓冲区:GPU提前分配⼀块显存,将顶点数据预先缓存到显存当中,性能更高。
- 位图(bitmap)
jpg/png类型 是压缩图片,需要先解压成位图(即纹理,位图大小:像素点 * 4个字节(RGBA)),才可最终显示到屏幕。
- 管线
在OpenGL 下渲染图形,就会有经历⼀个⼀个节点,⽽这样的操作可以理解为管线。每个任务类似流⽔线般执行,任务之间有先后顺序。
管线是⼀个抽象的概念,之所以称为管线是因为显卡在处理数据的时候是按照⼀个固定的顺序来的,⽽且严格按照这个顺序。就像⽔从⼀根管子的一端流到另一端,这个顺序是不能打破的.
- 固定管线/ 可编程管线
- 固定管线/存储着⾊器:在早期的OpenGL 版本,它封装了很多种着⾊器程序块,内置的⼀段包含了光照、坐标变换、裁剪等诸多功能的固定shader程序,来帮助开发者来完成图形的渲染. ⽽开发者只需要传⼊相应的参数,就能快速完成图形的渲染. 类似于iOS开发会封装很多API,⽽我们只需要调用,就可以实现功能.不需要关注底层实现原理.
- 可编程管线:由于OpenGL 的使⽤场景⾮常丰富,固定管线/存储着⾊器⽆法完成每⼀个业务,因此OpenGL开放了相关部分功能供开发者编程。
- 着⾊器程序Shader
- 着⾊器程序Shader:类似于函数代码段,可供GPU使用。OpenGL在实际调⽤绘制函数之前,需要指定⼀个由shader编译成的着⾊器程序。
- 常见的着⾊器:
顶点着⾊器(VertexShader),
⽚元着⾊器 (FragmentShader)/像素着⾊器(PixelShader),(⽚元/像素着⾊器是在OpenGL/DX中的不同叫法)
⼏何着⾊器 (GeometryShader),
曲⾯细分着⾊器(TessellationShader)等。- 可编程渲染管线: 直到 OpenGL ES 3.0,依然只⽀持顶点着⾊器和⽚元着⾊器这两个最基础的着⾊器。
- OpenGL在处理shader时,和其他编译器一样。通过编译、链接等步骤,⽣成了着⾊器程序(glProgram),着⾊器程序同时包含了顶点着⾊器和⽚段着⾊器的运算逻辑。在OpenGL进⾏绘制的时候,⾸先由顶点着⾊器对传入的顶点数据进⾏运算。再通过图元装配,将顶点转换为图元。然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传 ⼊片元着⾊器中进行运算。⽚段着⾊器会对栅格化数据中的每⼀个像素进行运算,并决定像素的颜⾊。
- 顶点着⾊器VertexShader
- 顶点着⾊器是OpenGL中⽤于计算顶点属性的程序。比如确定顶点位置,处理图形缩放/平移/旋转位置的换算,以及手机屏幕上显示3D图形数据转成2D的投影换算等。
- 顶点着⾊器是逐顶点并行运算的程序,即每个顶点数据都会执行⼀次顶点着⾊器,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据.
- 典型的需要计算的顶点属性包括顶点坐标变换、逐顶点光照运算等。顶点坐标由⾃身坐标系转换到归⼀化坐标系的运算,就是发⽣在这里。
- ⽚元着⾊器FragmentShader
- ⽚元着色器是OpenGL中⽤于计算⽚段(像素)颜色的程序。⼀般⽤来处理图形中每个像素点颜⾊计算和填充。(又叫像素着色器。)
- ⽚元着⾊器是逐像素并⾏运算的程序,即每个像素都会执⾏⼀次⽚元着⾊器。
- 比如图片的饱和度调整,模糊效果等,都是发生在这里。
- GLSL(OpenGL Shading Language)
- OpenGL着⾊语言 : ⽤来在OpenGL/ES中着⾊编程的语⾔,在图形卡的GPU (Graphic Processor Unit图形处理单元)上执⾏。
- GLSL(GL Shading Language)的着⾊器代码分成2个部分: Vertex Shader(顶点着⾊器)和Fragment(⽚元着⾊器)
- 光栅化Rasterization
光栅化: 把顶点数据转换为片元的过程。⽚元中的每⼀个元素对应帧缓冲区中的⼀个像素。
- 光栅化是将⼏何图元变为⼆维图像的过程。该过程包含两部分⼯作:1. 确定图形在像素上的位置;2. 填充颜色值、深度值。
- 光栅化 过程产生⽚元。
- 离屏渲染会触发光栅化。
- 纹理
纹理即位图。
OpenGL中 .tga表示纹理文件;
OpenGL ES中,位图即是纹理文件。
- 混合(Blending)
透明图层的叠加,会触发颜色混合计算;
离屏渲染的组透明度也会触发混合计算。
- 变换矩阵(Transformation)
图形发⽣平移,缩放,旋转变换,需要使⽤变换矩阵
- 投影矩阵(Projection)
用于将3D坐标转换为⼆维屏幕坐标,实际线条也会在⼆维坐标下进⾏绘制
- 2D笛卡尔坐标系
平面坐标系,顶点位置由(x,y)确定。
- 3D笛卡尔坐标系
立体坐标系,顶点位置由(x,y,z)确定。
- 视口
坐标系对应屏幕区域的范围。
在OpenGL中,通过函数glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
设置。
- 投影
透视投影 vs 正投影投影方式有2种:
- 1.平行投影(正投影),物体在屏幕上大小和实际大小相同,不管远近,多用来显示2D效果;
- 2.透视投影,呈现“远小近大”的视觉效果,用来显示3D模拟动画,这种投影能够获得最大程度的逼真感。
- 坐标系
观察者坐标系, 世界坐标系等。
依据不同的观察者(Camara)作为原点,建立的坐标系。
- 坐标转换
坐标转换计算物体自身坐标系,通过模型换算,转换成世界坐标系,再通过观察者矩阵换算为观察者坐标系,通过适当的裁剪等换算处理,相关的坐标最终被转换为窗口坐标。
- 着色器渲染流程
着色器渲染流程过程:顶点—> 图元 —> 片元—> 像素
- 几何顶点被组合为图元(点,线段或多边形),然后图元被合成片元,最后片元被转换为帧缓存中的像素数据。
- 图元经过适当的裁剪,颜色和纹理数据的调整,相关坐标被转换为窗口坐标。最后,光栅化将裁剪好的图元转换为片元。
- 片元到像素的转换,经过 象素所有权(ownership)检测、裁剪检测、Alpha检测、模版检测、深度检测、融合、抖动、逻辑操作等处理。
网友评论