首先知道
OpenGL
/OpenGL ES
/Metal
都是利用GPU
芯片高效渲染图形图像,图形API 是iOS开发者唯⼀一接近GPU的方式。
专业名词理解
- OpenGL上下文 context
1、
在应用程序调⽤用任何OpenGL的指令之前,需要⾸先创建一个OpenGL的上下文,这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态
,这也是OpenGL指令执⾏的基础。
2、
对OpenGL上下⽂这个庞大的状态机中的某个状态或者对象进⾏操作,你得首先把这个对象设置为当前对象。因此,通过对 OpenGL指令的封装,是可以将OpenGL的相关调用封装成为⼀个面向对象的图形API。
3、
由于OpenGL上下文是⼀个巨⼤的状态机,切换上下文往往会产⽣较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不同线程中使用不同的上下文,上下文之间共享纹理、缓冲区等资源
。这样的方案,会比反复切换上下⽂,或者大量修改渲染状态,更加合理高效。
- 状态机
理论上的一种机器,描述对象在生命周期内经历的各种状态。
有记忆功能,能记住当前的状态;
可以接收输入,根据输入的内容和原先的状态来修改当前状态,并且可以有对应输出;
当进入特殊状态(停机状态)的时候,不接收输入,停止工作;
- OpenGL状态机
通过上面的描述,类推到OpenGL
OpenGL可以记录自己的状态(比如当前使用的颜色、是否开启了混合功能等);
OpenGL可以接收输入(调用OpenGL函数的时候,可以看出OpenGL在接收我们的输入),如调用glColor3f,则OpenGL接收到这个输入后会修改自己的当前颜色的状态;
OpenGL进入停止状态,不在接收输入;
- 渲染
将图形或图像数据转换成3D空间图像的操作就是渲染
- 顶点数组、顶点缓冲区
画图一般是先画好骨架,然后往骨架里面填充颜色,OpenGL也一样。
顶点数据就是图像的骨架,OpenGL中的图像是图元组成,有3中类型的图元:点、线、三角形。
在调用绘制方法的时候,由内存传入顶点数据,这些数据之前是存储在内存当中,称为顶点数组
。性能更高的做法是,提前分配一块显存,将顶点数据先传入到显存当中。这部分的显存,就是顶点缓冲区
。
- 管线
是一个抽象概念,类似于工厂加工流水线。显卡在处理数据的时候按照一个固定的顺序执行,就像水从一根管子的一端流到另一端,顺序不能打破。
- 固定管线/存储着色器
就是封装了很多着色器功能的固定shader程序来帮助开发者完成渲染,开发者只需要传入相应的参数就可以,
类似于iOS封装的API,只需要调用,不用关心底层实现。
固定管线或存储着色器无法完成业务是,可将相关部分开放成可编程。
- 着色器程序 Shader
OpenGL在实际调用绘制函数之前,需要指定一个由shander编译成的着色器程序。常见的着色器有
顶点着色器
、片元着色器
、几何着色器、细分着色器。到OpenGLES 3.0,依然只支持了顶点着色器和片元着色器;
OpenGL在处理shader时,和其他编译器一样。通过编译、链接等步骤,⽣成了着色器程序(glProgram),着色器程序同时包含了顶点着色器和片元着色器的运算逻辑。在OpenGL进⾏绘制的时候,⾸先由顶点着⾊器对传入 的顶点数据进⾏运算。再通过图元装配,将顶点转换为图元。然后进⾏光栅化,将图元这种⽮量图形,转换为栅格化数据。最后,将栅格化数据传⼊片段着⾊器中进⾏运算。⽚元着色器会对栅格化数据中的每一个像素进⾏运算,并决定像素的颜⾊。
- 顶点着色器 VertexShader
用来处理图形每个顶点的变换(旋转/平移/投影等),逐个顶点运行,有几个顶点就运行几次,是并行的,顶点着色器运算过程中无法访问其他顶点的数据;
一般来说典型的需要计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等等。顶点坐标由自身坐标系转换到归⼀化坐标系的运算,就是在这里发生的。
- 片元着色器 FragmentShader
用来处理图形中每个像素点的颜色计算和填充,逐像素预算,每个像素都是执行一次片元着色器。
- GLSL (OpenGL Shading Language)
OpenGL着色语言,是OpenGL中着色编程的语言,在GPU上执行,是渲染管线中不同层次具有可编程性。
- 光栅化(Rasterization)
把顶点数据转换成片元的过程,片元中的每一个像素对应帧缓存区中的一个像素;
光栅化其实是一种将几何图元变为二维图像的过程。该过程包含了两部分的工作。第一部分工作:决定窗口坐标中的哪些整型栅格区域被基本图元占用;第二部分⼯作:分配一个颜色值和一个深度值到各个区域。光栅化过程产⽣的是片元。
- 混合(Blending)
混合指的是颜色混合,当开启混合功能之后,如果像素没有被剔除,那么像素的颜色将和帧缓冲的颜色进行混合。
- 变换矩阵(Transformatio)投影矩阵(Projection)
变换矩阵:图形想发生平移、缩放、旋转等变换,就需要变换矩阵;
投影矩阵:把3D坐标转换为二维屏幕坐标。
- 渲染上屏/交换缓冲区(SwapBuffer)
常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕的显示。(简单来说就是离屏缓冲区渲染后和屏幕缓冲区交换,由屏幕缓冲区显示在屏幕上)。
-
image
image.png
网友评论