对OpenGLES2.0渲染管线的理解

来源:互联网 发布:淘宝cdk 编辑:程序博客网 时间:2024/04/30 20:41

        在学习OpenGLES时,每一本书开始都会向我们介绍渲染管线,当我在开始学习它时,看这些东西完全不明白在说什么,经过一段时间对3D程序的开发和研究现在对渲染管线也有了一些自己的理解。由于WebGL是基于OpenGLES2.0实现的一套JavaScript封装API(其中也有一些特有的部分),那么就先聊聊我对OpenGLES2.0渲染管线的理解吧。


        我们就从这张图开始理顺OpenGLES2.0的渲染流程吧!

        1.基本处理:

        首先在该阶段将物体的信息传递给GPU其中包括了顶点位置,顶点的纹理坐标,顶点颜色等,最后还需要设置绘制方式,其中包括了:点绘制、线段绘制、三角形绘制。

        2.顶点缓冲区对象(VBO)/顶点数组对象(VAO):

        这部分功能是可选的,在模型的基本信息基本不变的情况下,我们可以通过将数据放入显存而不用每次从内存向显存传递,从而减少IO开销(VBO),并使用数组记录每一块数据对应绑定的类型(顶点位置、法向量),这也是优化的一种方法(VAO)其具体说明可以看我的另一篇博客,其中有详细的介绍:http://blog.csdn.net/srk19960903/article/details/74999018

        3.顶点着色器

        顶点着色器为一个可编程的处理单元,功能为执行顶点的变换、光照、材质的应用与计算等顶点的相关操作,其每顶点执行一次。其工作过程为首先将原始的顶点几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标、颜色、点位置等后继流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。

        4.图元装配

        图元装配主要分为两个阶段:图元组装和图元处理。

        图元组装:将顶点着色器处理好的顶点进行组成,组装的方式有点绘制、线段绘制和常用的三角形绘制。点绘制方式下每个图元仅需要一个单独的顶点,此方式下每个顶点为一个图元;线段绘制方式每个图元则需要两个顶点,此方式下每两个顶点构成一个图元;三角形绘制方式下需要3个顶点构成一个图元。

        图元处理:首先需要消除位于半空间(half-space)之外的部分几何图元,这个半空间是由一个剪裁平面所定义的。例如,点剪裁就是简单地接受或者拒绝顶点,线段或多边形剪裁可能需要增加额外的顶点,具体取决于直线或者多边形与剪裁平面之间的位置关系,剪裁时,若图元完全位于视景体以及自定义剪裁平面的内部,则将图元传递到后面的步骤进行处理;如果其完全位于视景体或者自定义剪裁平面的外部,则丢弃该图元;如果其有一部分位于内部,另一部分位于外部,则需要剪裁该图元。最后如果开启了背面剪裁还需要判断改图元是否是背面面对摄像机,如果是则需要将其剔除。

        5.光栅化

        光栅化是将图元转化为一组二维片段的过程,然后,这些片元由片元着色器处理。这些二维片元代表着可在屏幕上绘制的像素。用于从分配给每个图元顶点的顶点着色器输出生成每个片元值的机制称作插值。简单来说就是将3D空间中的物体转换成屏幕上的一个个像素点(其实应该称之为“候选像素点”,因为后面还有深度测试会剔除被挡住的部分),此时这些点是没有颜色的只有位置信息和深度信息,具体的颜色还需要在片元着色器中进行赋值。

       6.片元着色器

        片元着色器是用于处理片元值及其相关数据的可编程单元,其可以执行纹理的采样、颜色的汇总、计算雾颜色等操作,每片元执行一次。片元着色器主要功能为通过重复执行(每片元一次),将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后继阶段,如剪裁测试、深度测试及模板测试等。

        7.剪裁测试

        如果程序中启用了剪裁测试,OpenGLES会检查每个片元在帧缓冲中对应的位置,若对应位置在剪裁窗口中则将此片元送入下一阶段,否则丢弃此片元。也就是可以在屏幕上指定一片区域绘制,不在这片区域不进行绘制。

        8.深度测试与模板测试

        深度测试:

        深度测试是指将输入片元的深度值与帧缓冲区中存储的对应位置片元的深度值进行比较,若输入片元的深度值小则将输入片元送入下一阶段准备覆盖帧缓冲中的原片元或与帧缓冲中的原片元混合,否则丢弃输入片元。

        模板测试:

        模板测试的主要功能为将绘制区域限定在一定的范围内,一般用在湖面倒影、镜像等场合,我的另一篇博客也有对此的 介绍http://blog.csdn.net/srk19960903/article/details/73928426

        9.颜色缓冲混合

        若程序中开启了Alpha混合,则根据混合因子将上一阶段送来的片元与帧缓冲中对应位置的片元进行Alpha混合;否则送入的片元将覆盖帧缓冲中对应位置的片元。

        10.帧缓冲

        OpenGL ES中的物体绘制并不是直接在屏幕上进行的,而是预先在帧缓冲区中进行绘制,每绘制完一帧再将绘制的结果交换到屏幕上。因此,在每次绘制新的一帧时都需要清除缓冲区中的相关数据,否则有可能产生不正确的绘制效果。

        哇咔咔,打了这么多字终于一点一点的把自己对OpenGLES渲染管线的理解总结完了,希望大家能够多提意见~嗯嗯,因为OpenGLES2.0与WebGL还是有着一些差距,所以下次准备研究研究WebGL上的VAO,VBO还有FBO这些~

原创粉丝点击