<二>OpenGL渲染管线
渲染管线(渲染流水线/渲染处理流程)。
OpenGl ES2.0 渲染管线

1.0 基本处理
基本处理阶段设定3D空间中物体的顶点坐标,顶点对应颜色,顶点的纹理坐标等属性。并且之指定绘制方式:点绘制,线绘制,三角形绘制。为图元装配做准备。
1.1 顶点缓冲对象
这部分功能在程序中是可选的。对于某些场景下顶点的基本数据不变的情况。可以在初始化阶段将顶点数据经过基本处理后直接送入顶点缓冲对象。在绘制每一帧时就可以直接从缓冲对象中取顶点数据,一定程度上节省了GPU的IO带宽和提升渲染效率吧。
2.0 顶点着色器
该过程会首先将原始的顶点几何信息及其他属性传送到顶点着色器中,经过自己开发的顶点着色器处理后产生纹理坐标,颜色,点位置等后续流程需要的各项顶点属性信息,然后将其传递给图元装配阶段。

顶点着色器的输入包括:
- 着色器程序——描述顶点上执行操作的顶点着色器程序源代码或者可执行文件。
- 属性变量(attribute)——用顶点数组提供的每个顶点的数据。
- 统一变量(uniform)——顶点着色器使用的不变数据。
- 采样器——代表顶点着色器使用纹理的特殊统一变量类型。
顶点着色器的输出包括:
- 内建输出变量——例如gl_Position,经过变换矩阵变换后的顶点最终位置。
- 易变变量(varying)——从顶点着色器计算产生并传递给片元着色器的数据变量。
顶点着色器阶段也是程序可编辑的处理顶点信息变换的阶段。在OpenGl ES1.0中是固定的渲染流程,顶点的变换是固定的,没有顶点着色器。
3.0 图元装配
顶点数据会在该阶段根据设置的绘制方式被结合成完整的图元信息。
例如: 点绘制方式仅需要一个单独的顶点,此方式下每个顶点为一个图元。
图元装配后会进行裁剪处理,裁剪观察空间之外的部分几何图元,这里也叫屏幕映射。
之所以裁剪是因为随着观察位置,角度的不同,并不总能看到3D物体的某个图元的全部。
例如:当观察一个正四边体并离某个三角形面很近时,可能只能看到此面的一部分。这时在屏幕上显示的就不再是三角形,而是经过裁剪后的多边形。
4.0 光栅化
由于虚拟3D世界当中物体的几何信息一般采用连续的数学量来表示。但是目前的显示设备屏幕都是离散化的(由一个个像素组成),因此还需要将投影结果离散化,把其分解成一个个离散化的小单元,这些小单元被称为片元。每个片元对应帧缓冲区中的一个像素。
如图:

5.0 片元着色器
片元着色器是用于处理片元值及其相关数据的可编程单元,在这里可以执行纹理的采样,颜色的汇总,计算雾颜色等操作,每片元执行一次。
由于每片元(像素)执行一次,可编程部分需要注意性能的消耗。
片元着色器主要功能为通过重复执行(每片元一次),将3D物体中的图元光栅化后产生的每个片元的颜色等属性计算出来送入后续阶段。
片元着色器的输入包括:
- 易变变量(varying)—从顶点着色器传递到片元着色器的易变变量数据。
片元着色器的输出包括: - gl_FragColor ——计算后的片元颜色,一般在片元着色器的最后都会对gl_FragColor 进行赋值。
![image]()
6.0 裁剪测试
指定一个矩形的剪裁区域,当启用剪裁测试后,只有在这个区域之内的像素才能被绘制,其它像素被丢弃
7.0 深度测试和模版测试
- 深度测试:在深度缓冲区中为每个像素保存了一个 “深度值”(顶点到相机的距离),当像素需要进行深度测试时,将缓冲区中深度值与该像素的深度值进行比较,符合条件的通过测试,并覆盖缓冲区中深度值,不符合条件的则被丢弃,不进行绘制;
- 模版测试:在模板缓冲区中为每个像素保存了一个 “模板值” ,当像素需要进行模板测试时,将缓冲区中模板值与该像素的模板值进行比较,符合条件的通过测试,不符合条件的则被丢弃,不进行绘制;
8.0 颜色混合
在物体遮挡场景下,未开启混合时,前面的物体会遮住后面物体;开启混合后,根据物体的色光三元色和透明度进行混合。
可在
http://www.andersriggelsen.dk/glblendfunc.php
调试不同颜色的混合效果

浙公网安备 33010602011771号