图形api简介
1.OpenGL (Open Graphics Library)
是⼀一个跨编程语⾔言、跨平台的编程图形程序接⼝口,它将计算机的资源抽象称为⼀一个个OpenGL的对象,对这些资源的操作抽象为⼀一个个的OpenGL指
2.OpenGL ES (OpenGL for Embedded Systems)
是 OpenGL 三维图形 API 的⼦子集,针对⼿手机、PDA和游戏主机等嵌⼊入式设备⽽而设计,去除了了许多不不必要和性能较低的API接⼝口。
3.DirectX
是由很多API组成的,DirectX并不不是⼀一个单纯的图形API. 最重要的是DirectX是属于Windows上⼀一个多媒体处理理框架.并不不⽀支持Windows以外的平台,所以不不是跨平台框架. 按照性质分类,可以分为四⼤大部分,显示部分、声⾳音部分、输⼊入部分和⽹网络部分.
4.Metal
Metal: Apple为游戏开发者推出了了新的平台技术 Metal,该技术能够为 3D 图像提⾼高 10 倍的渲染性能.Metal 是Apple为了了解决3D渲染⽽而推出的框架
OpenGL专业名词解析
状态机:状态机是理论上的一种机器,我理解的状态机其实就是相当于电脑,电脑有内存磁盘,可以记录电脑当前的状态,比如安装的软件,放在磁盘里面的音频,视频,图片等,可以输入外接外设,U盘等,可以根据输入内容修改内存磁盘的内容,也可以记录一些特殊状态,比如关机,关机的时候是不可以输入输出内容,停止工作
上下文:OpenGL只是图形API,它没有窗口的支持,在这里可以先简单的理解为就是这个窗口。也就是说,如果我们要使用OpenGL,需要先为它创建一个窗口。当然OpenGL的Context不只是这个窗口,Context还包含一些参数设置信息,比如当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。
渲染:将需要显示的比如视频/按钮/图片转换成 3D 空间图像的操作叫做渲染(Rendering)。
顶点数组:所有模型都可以看成是由若干个顶点构成,每个顶点有自己的空间坐标、颜色坐标、法线坐标等。所以绘制图形可以通过绘制顶点来完成,但在绘制多个顶点时,使用顶点数据数组要快得多,也要方便得多。OpenGL支持多个顶点数组
顶点缓存区:顶点数据就是图像的轮廓。OpenGL中的图像都是由图元组成。在OpenGL ES中,有3种类型的图元:点、线、三⻆形。每次绘制时从先从内存中加载这些数据,这样会带来绘制延时,因此我们想着在显存中开辟一块区域,在每次绘制间隔就将顶点数据加载过来,这样绘制时直接读取显存中的数据就可以了,明显提高渲染速度。于是,我们需要引入顶点缓冲区。OpenGL由于需要处理内存与GPU的数据传输,也要用到一系列缓冲区对象,顶点缓冲区只是其中之一。在顶点数组的基础上使用顶点缓冲区可以提高渲染速率。
管线:流水线 其实是指三维渲染的过程中显卡执行的,从几何体到最终渲染图像的,数据传输处理计算过程
固定管线:就是OpenGL封装了多种着色器程序块,内置了一段包含了光照、坐标变换、裁剪等诸多功能的固定shader程序来完成。来帮助开发者来完成图形的渲染。开发者只需要传入相应的参数,就能快速完成图形的渲染。类似于iOS开发会封装很多API,而我们只需要调⽤,就可以实现功能,不需要关注底层实现原理
着色器:(shader)是用来实现图像渲染的,用来替代固定渲染管线的可编辑程序
比如画画的时候我们经常有这么一个过程:先打线稿,再上色。着色器就是用来做这个工作的
固定着色器:OpenGL提供的着色器,就像是苹果提供了固定api,自己只要调用就可以
顶点着色器:(vertex shader)这个是告诉电脑如何打线稿的——如何处理顶点、法线等的数据的小程序。1.确定位置 2.缩放/平移/旋转位置换算3.显示
片元着色器:(fragment shader)这个是告诉电脑如何上色的——如何处理光、阴影、遮挡、环境等等对物体表面的影响,最终生成一副图像的小程序。处理一个一个像素点
GLSL(自定义着色器):GLSL着色语⾔是⽤来在OpenGL中着⾊编程的语⾔,是在图形卡的GPU上执⾏的。代替了固定的渲染管线的⼀部分,使渲染管线中不同层次具有可编程性。⽐如:视图转换、投影转换等。GLSL(GL Shading Language)的着⾊器代码分成2个部分: Vertex Shader(顶点着⾊器)和Fragment(⽚断着⾊器)。
光栅化:把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。
纹理:纹理可以理解为图⽚。 在渲染图形时需要在顶点围成的区域中填充图⽚,使得场景更加逼真。⽽这⾥使⽤的图⽚,就是常说的纹理。只是在OpenGL,我们更加习惯叫纹理,⽽不是图⽚。
混合:在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜⾊附着上的颜色进⾏混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法有限。如果需要更加复杂的混合算法,一般可以通过片段着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些。比如layer两个图层 红色0.5 +粉色0.2-> 叠加在一起=颜色混合行为
变换矩阵:例如图形想发⽣平移、缩放、旋转等变换,就需要使用变换矩阵。
投影矩阵:
1.正角投影:用于平面图形
2透视投影:用于3D图形,计算机显示器是一个2D平面。OpenGL渲染的3D场景必须以2D图像方式投影到计算机屏幕上
渲染上屏/交换缓冲区(SwapBuffer)
渲染缓冲区⼀一般映射的是系统的资源⽐比如窗⼝口。如果将图像直接渲染到窗⼝口对应的渲染缓冲区,则可以
将图像显示到屏幕上。
但是,值得注意的是,如果每个窗⼝口只有⼀一个缓冲区,那么在绘制过程中屏幕进⾏行行了了刷新,窗⼝口可能显
示出不不完整的图像
为了了解决这个问题,常规的OpenGL程序⾄至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有
显示的称为离屏缓冲区。在⼀一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像
在屏幕上的显示。
由于显示器器的刷新⼀一般是逐⾏行行进⾏行行的,因此为了了防⽌止交换缓冲区的时候屏幕上下区域的图像分属于两个
不不同的帧,因此交换⼀一般会等待显示器器刷新完成的信号,在显示器器两次刷新的间隔中进⾏行行交换,这个信
号就被称为垂直同步信号,这个技术被称为垂直同步
使⽤用了了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进⾏行行下⼀一帧的渲染,使得帧率
⽆无法完全达到硬件允许的最⾼高⽔水平。为了了解决这个问题,引⼊入了了三缓冲区技术,在等待垂直同步时,来
回交替渲染两个离屏的缓冲区,⽽而垂直同步发⽣生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实
现充分利利⽤用硬件性能的⽬目的