简介
OpenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程图形程序接口,它将计算机的资源抽象称为一个个OpenGL的对象,对这些资源的操作抽象为一个个的OpenGL指令。
OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,去除了许多不必要和性能较低的API接口。
Metal是Apple为游戏开发者推出了新的平台技术,该技术能够为 3D 图 像提⾼ 10 倍的渲染性能。Metal 是Apple为了解决3D渲染⽽推出的框架。
OpenGL名词
1.渲染:
渲染是计算机从模型到最终的图像创建的过程。OpenGL只是计算机渲染系统的其中一种,基于光栅化的系统。
2.OpenGL 状态机:
可以看做一个上下文(context),在调用任何OpenGL的指令之前,都需要先创建并进入这样的上下文中,它可以记录自己当前的状态,并能接收新的输入(调用 OpenGL 函数),当关闭了上下文,就不再接收输入。
3.顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
画图一般是先画图像的骨架,然后往骨架里面填充颜色,OpenGL也是一样的,顶点数据就是要画的图像的骨架,只是OpenGL的图像骨架是由图元组成。在OpenGL ES中,由点、线、三角形三种基本的图元组成,一般来说顶点数据(顶点数组)存储在内存中,而性能更高的做法是提前分配一块显存,将顶点数据预先传入到显存中,这部分的显存即为顶点缓冲区。 顶点指的是在绘制一个图形时的顶点位置数据,这个数据可以直接存储在数组中或者缓存到GPU内存中。
4.着色器 (Shader):
为图形渲染管线中的某个特定部分,将输入转化为输出的程序。在 OpenGL 中,会涉及到六种不同的着色阶段,其中最常用的包括顶点着色器以及片元着色器,前者用于处理顶点数据,后者用于处理光栅化后的片元数据。着色器运行在 GPU 上,在 OpenGL 使用它之前,必须经过编译并链接为一个着色器程序对象(Shader Program Object)。
4.1顶点着⾊器(VertexShader)
⼀般⽤来处理图形每个顶点变换(旋转/平移/投影等)顶点着⾊器是OpenGL中⽤于计算顶点属性的程序。顶点着⾊器是逐顶点运 算的程序,也就是说每个顶点数据都会执⾏⼀次顶点着⾊器,当然这是并 ⾏的,并且顶点着⾊器运算过程中⽆法访问其他顶点的数据。 ⼀般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照 运算等等。顶点坐标由⾃身坐标系转换到归⼀化坐标系的运算,就是在这 ⾥发⽣的。
4.2⽚元着⾊器(FragmentShader)
⼀般⽤来处理图形中每个像素点颜⾊计算和填充⽚段着⾊器是OpenGL中⽤于计算⽚段(像素)颜⾊的程序。⽚段着⾊器是 逐像素运算的程序,也就是说每个像素都会执⾏⼀次⽚段着⾊器,当然也 是并⾏的
5.管线:
在OpenGL下渲染图形,就会有经历⼀个⼀个节点。⽽这样的操作可以理解管线。⼤家可以想象成流⽔线,每个任务类似流⽔线般执⾏。任务之间有先后顺序。管 线是⼀个抽象的概念,之所以称之为管线是因为显卡在处理数据的时候是按照 ⼀个固定的顺序来的,⽽且严格按照这个顺序。就像⽔从⼀根管⼦的⼀端流到 另⼀端,这个顺序是不能打破的。
5.1固定管线/存储着⾊器
在早期的OpenGL 版本,它封装了很多种着⾊器程序块内置的⼀段包含了光 照、坐标变换、裁剪等等诸多功能的固定shader程序来完成,来帮助开发者 来完成图形的渲染. ⽽开发者只需要传⼊相应的参数,就能快速完成图形的 渲染。类似于iOS开发会封装很多API,⽽我们只需要调⽤,就可以实现功能。不 需要关注底层实现原理。 但是由于OpenGL 的使⽤场景⾮常丰富,固定管线或存储着⾊器⽆法完成每⼀ 个业务。这时将相关部分开放成可编程。
6.光栅化(Rasterization)
光栅化是把顶点数据转换为⽚元的过程,具有将图转化为⼀个个栅格组成的图象的作⽤,特点是每个元素对应帧缓冲区中的⼀像素。 光栅化就是把顶点数据转换为⽚元的过程。⽚元中的每⼀个元素对应于帧 缓冲区中的⼀个像素。 光栅化其实是⼀种将⼏何图元变为⼆维图像的过程。该过程包含了两部分 的⼯作。第⼀部分⼯作:决定窗⼝坐标中的哪些整型栅格区域被基本图元 占⽤;第⼆部分⼯作:分配⼀个颜⾊值和⼀个深度值到各个区域。光栅化 过程产⽣的是⽚元。
7.纹理
纹理可以简单的理解为一张图片,在渲染图形时需要在其编码填充图片,为了使得场景更加逼真,而这里使用的图片,就是常说的纹理,但是在OpenGL中,我们更加习惯叫纹理,而不是图片。
8.混合
在测试阶段后,如果像素依然没有被剔除,那么像素的颜色将会和帧缓冲区中颜色附着上的颜色进行混合,混合的算法可以通过OpenGL的函数进行指定。但是OpenGL提供的混合算法是有限的,如果需要更复杂的混合算法,一般可以通过像素着色器进行实现,当然性能会比原生的混合算法要差一些。
9.变换矩阵(Transformation)
在图形想发生平移、缩放、旋转变换时,就需要使用到变换矩阵。
10.投影矩阵(Projection)
用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标下进行绘制。
11.渲染上屏/交换缓冲区(SwapBuffer)
渲染缓冲区一般映射的是系统的资源比如窗口,如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上。 如果每一个窗口只有一个缓冲区,那么在绘制过程中屏幕进行了刷新,窗口可能显示出不完整的图像,为了解决以上问题,常规的OpenGL程序至少都会有2个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏幕缓冲区交换,实现图像在屏幕上的显示。 由于显示器的刷新一般都是逐行进行的,因此为了防止交换缓冲区的时候屏幕上下区域的图像分属2个不同的帧,因此交换一般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进行交换,这个信号就被称为垂直同步信号,这个技术被称为垂直同步。 在使用了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进行下一帧的渲染,使得帧率无法完全达到硬件允许的最高水平。为了解决这个问题,引入了三缓冲区技术,在等待垂直同步时,来回交替渲染2个离屏的缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利用硬件性能的目的。