OpenGLES3.0笔记 (一) —— 渲染流程介绍

OpenGL ES 3.0图形管线图

opengles图形管线.jpg

相比于2.0版的图形管线图,OpenGLES3.0新增了一个功能——变换反馈,使顶点着色器输出可以选择性地写入一个输出缓冲区(除了传递给片段着色器之外,也可用这种传递替代)

术语介绍

  • 管线,Pipeline,显卡执行的、从几何体到最终渲染图像的、数据传输处理计算的过程
    OpenGLES1.X中它是固定管道,整体式封闭的,中间的各道工艺按固定的流程顺序走。
  • 几何图元:包括点、直线、三角形,均是通过顶点(vertex)来指定的。
  • 模型:根据几何图元创建的物体。
  • 渲染:计算机根据模型创建图像的过程。
    -FrameBuffer:帧缓冲区,帧缓冲区保存了图形硬件为了控制屏幕上所有像素的颜色和强度所需要的全部信息。

渲染管线的几个关键阶段

1. 为顶点缓冲区指定几何对象

所谓几何对象,就是上面说过的几何图元,这里将根据具体执行的指令绘制几何图元。比如,OpenGL提供给开发者的绘制方法glDrawArrays,这个方法里面的第一个参数是mode,就是制定绘制方式,可选值有以下几种。
- GL_POINTS:以点的形式进行绘制,通常用在绘制粒子效果的场景中。
- GL_LINES:以线的形式进行绘制,通常用在绘制直线的场景中。
- GL_TRIANGLE_STRIP:以三角形的形式进行绘制,所有二维图像的渲染都会使用这种方式。

2. 在顶点着色器中进行可编程的顶点处理

不论以上的几何对象是如何指定的,所有的几何数据都将会经过这个阶段。这个阶段所做的操作就是,根据模型视图和投影矩阵进行变换来改变顶点的位置,根据纹理坐标与纹理矩阵来改变纹理坐标的位置,如果涉及三维的渲染,那么这里还要处理光照计算和法线变换(本书不会涉及三维的渲染)。这里的输出是以gl_Position来表示具体的顶点位置的,如果是以点(GL_POINTS)来绘制几何图元,那么还应该输出gl_PointSize。

3. 图元装配

在经过步骤2的顶点处理操作之后,不论是模型的顶点,还是纹理坐标都是已经确定好了的。在这个阶段,顶点将会根据应用程序送往图元的规则(如GL_POINTS、GL_TRIANGLES等),将纹理组装成图元。
对于每个图元,必须确定图元是否位于视锥体(屏幕上可见的 3D 空间区域)内。如果图元没有完全在视锥体内,则可能需要进行裁剪。如果图元完全处于该区域之外,它就会被抛弃。裁剪之后,顶点位置被转换为屏幕坐标。也可以执行一次淘汰操作,根据图元面向前方或者后方抛弃它们。裁剪和淘汰之后,图元便准备传递给管线的下一阶段 ― 光栅化阶段。

4. 光栅化

光栅化是将图元转化为一组二维片段的过程,图元数据在此将会被分解成更小的单元并对应于帧缓冲区的各个像素。这些单元称为片段,一个片段可能包含窗口颜色、纹理坐标等属性。片段的属性是根据顶点坐标利用插值来确定的,这其实就是栅格化操作,也就是确定好每一个片段的屏幕坐标、颜色、纹理坐标等属性。

5. 在片段着色器进行可编程的片段处理

通过纹理坐标取得纹理(texture)中相对应的片段像素值(texel),根据自己的业务处理(比如提亮、饱和度调节、对比度调节、高斯模糊等)来变换这个片段的颜色。这里的输出是gl_FragColor,用于表示修改之后的像素的最终结果。

6. 帧缓冲操作

该阶段主要执行帧缓冲的写入操作,这也是渲染管线的最后一步,负责将最终的像素值写到帧缓冲区中。

7. glFinish和glFlush

提交给OpenGL的绘图指令并不会马上发送给图形硬件执行,而是放到一个缓冲区里面,等待缓冲区满了之后再将这些指令发送给图形硬件执行,所以指令较少或较简单时是无法填满缓冲区的,这些指令自然不能马上执行以达到所需要的效果。因此每次写完绘图代码,需要让其立即完成效果时,开发者都需要在代码后面添加glFlush()或glFinish()函数。

  • glFlush()的作用是将缓冲区中的指令(无论是否为满)立刻发送给图形硬件执行,发送完立即返回。
  • glFinish()的作用也是将缓冲区中的指令(无论是否为满)立刻发送给图形硬件执行,但是要等待图形硬件执行完成之后才返回这些指令。

在上面介绍的渲染流程中,步骤2和步骤5提供了可编程的着色器来代替OpenGL ES中渲染管线的某一阶段,后面的笔记中会学习到具体如何实现顶点着色器和片元着色器

你可能感兴趣的:(OpenGLES3.0笔记 (一) —— 渲染流程介绍)