二、OpenGL专业名词了解
状态机
状态机就是一种存在于理论中的机器,它具有以下的特点:
- 它有记忆的能力,能够记住自己当前的状态。
- 它可以接收输入,根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出。
- 当它进入某个特殊的状态(停机状态)的时候,它不再接收输入,停止工作。
OpenGL也可以看成这样的一种机器:
- OpenGL可以记录自己的状态(比如:当前所使用的颜色、是否开启了混合功能,等等,这些都是要记录的)
- OpenGL可以接收输入(当我们调用OpenGL函数的时候,实际上可以看成OpenGL在接收我们的输入),根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出(比如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;我们调用glRectf,则OpenGL会输出一个矩形)
- OpenGL可以进入停止状态,不再接收输入。这个可能在我们的程序中表现得不太明显,不过在程序退出前,OpenGL总会先停止工作的。
OpenGL上下文(context)
在应用程序调用任何OpenGL的指令前,首先需要创建一个OpenGL的上下文。这个上下文就是一个非常庞大的状态机,保存了OpenGL中各种状态,这也是OpenGL指令执行的基础。
1.OpenGL指令执行的基础,是一个非常庞大的状态机
2.OpenGL上下文切换开销大。虽然可能使用多个上下文,但上下文之间会共享纹理、缓冲区等资源
3.OpenGL的函数虽然是面向过程的,但可以把相关的调用封装成为面向对象的图形API。
渲染(Rendering)
将图形/图像数据转换成2D空间图像操作叫做渲染。
顶点数组(VertexArray)和顶点缓冲区(VertexBuffer)
顶点数组就是要画的图像骨架,和现实中的不同是,OpenGL中的图像都是图元组成。在OpenGLES中,有三种图元:点、线、三角形。这些顶点数据最终存储在内存中,被称为顶点数据。
性能更高一点的是提前分配一块显存,将顶点数据存入其中,这部分显存称为顶点缓冲区。
管线
显卡在处理数据的时候是按照一个固定的顺序来的,而且严格按照这个顺序,不能打破。在OpenGL下渲染图形,就会经历一个个节点,而这样的操作可以理解为管线。
固定管线/存储着色器
早期的OpenGL版本封装了固定shader程序来帮助开发者完成图形的渲染,类似于iOS开发会封装很多API,而我们只需要调用,就可以实现功能,不需要关注底层原理。
由于OpenGL使用场景丰富,所以固定管线或者存储着色器无法完成没一个业务,这时将相关部分开放成可编程
顶点着色器VertexShader
1.一般用来处理图形的每个顶点变换[旋转、平移、投影]
2.顶点着色器是OpenGL中用于计算顶点属性的程序。顶点着色器是逐顶点运算的程序,也就是说每个顶点数据都会执行一次顶点着色器,当然这是并行的,并且顶点着色器运算过程中无法访问其他顶点的数据。
3.一般典型的计算的顶点属性主要包括顶点坐标变换、逐顶点光照运算等。顶点坐标由自身坐标系转换到归一化坐标系的运算,就是在这里发生的。
片元着色器FragmentShader
1.一般用来处理图形中每个像素点颜色计算和填充
2.片段着色器是OpenGL中用于计算片段(像素)颜色的程序。片段着色器是逐像素运算的程序,也就是说每个像素都会在执行一次片段着色器,当然是并行的。
GLSL
OpenGL着色语言是用来在OpenGL中着色编程的语言,是在图形GPU上运行的,代替固定管线的一部分,比如:视图转换、投影转换等。
包含两部分:VertexShader和Fragment(顶点着色器和片元着色器)
光栅化
光栅化是将一个图元转变为一个二维图像的过程。二维图像上每个点都包含了颜色、深度和纹理数据。将该点和相关信息叫做一个片元(fragment)。
光栅化的目的,是找出一个几何单元(比如三角形)所覆盖的像素。
粗略地讲:你模型的那些顶点在经过各种矩阵变换后也仅仅是顶点。而由顶点构成的三角形要在屏幕上显示出来,除了需要三个顶点的信息以外,还需要确定构成这个三角形的所有像素的信息。光栅化就是干这个的
纹理(texture)
通常说的纹理,指的是一张二维的图片,把它像贴纸一样贴在什么东西上面,让那个东西看起来像我们贴纸所要表现的东西那样。我们可理解为图片,为了使得场景更加的逼真而使用的图片,就是常说的纹理.
混合
在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明的物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。一个有色玻璃窗就是一种透明物体,玻璃有自身的颜色,但是最终的颜色包含了所有玻璃后面的颜色。这也正是混合这名称的出处,因为我们将多种(来自于不同物体)颜色混合为一个颜色,透明使得我们可以看穿物体。
变化矩阵(Transformation)
图形想要发生平移旋转缩放就需要用到变换矩阵
投影矩阵(Projection)
用于将3D坐标转换为二维屏幕坐标,实际线条也将在二维坐标系下进行绘制
渲染上屏/交换缓冲区(SwapBuffer)
1.常规OpenGL程序至少有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示
2.为了防止交换缓冲区时屏幕上下部分属于不同的帧,交换一般等待显示器刷新完成的信号,在显示器两次刷新的间隔进行交换,这个信号称为垂直同步信号,这个技术称为垂直同步
3.使用双缓冲区和垂直同步后, 由于总是等待缓冲区交换后再进行下一帧渲染,使得帧率无法达到硬件允许的最高水平。为了解决这个问题,引入三缓冲区技术,在等待垂直同步时,来交替渲染两个离屏的缓冲区,而垂直同步发生时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利用硬件性能的目的。