OpenGL渲染管线
OpenGL实现了渲染管线(rendering pipeline),实际上是一系列处理数据的过程,将应用程序的数据转换到最终渲染的图像。OpenGL首先接收用户提供的几何数据(顶点数据和图元数据,一般是顶点数据),将其输入到一系列的着色器中进行处理,这些着色器一共有6个阶段,一般刚需的有两个着色器:点着色器(vertex shader)和片元着色器(fragment shader)。其它四个分别是:细分着色器(其中就包含两个着色器)以及几何着色器。着色器处理中间还有图元装配的过程。经过数据处理后以后,数据将会被输入到光栅化单元(rasterizer),光栅化单元负责对所有裁剪区域内的图元生成片元数据,然后对所有的片元执行片元着色器。下面是OpenGL管线的流程框架:
一、OpenGL数据传输的预备工作
OpenGL需要将所有的数据都保存在缓存对象中(buffer object),由OpenGL维护的一块内存区域,而预备工作就是准备这些缓存区域以备存储输入的模型数据。可以用多种方式创建这样的数据缓存,最常用的是用函数void glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags);同时设置缓存的大小和内容。
二、数据从客户端(应用程序)传输到OpenGL(硬件厂商提供的OpenGL服务端)
缓存经过初始化(创建对象和分配内存),顶点数据就需要传输到OpenGL的缓存中进行存储。我们将一个顶点视为需要处理的数据包(应该是对每个顶点定义属性数据),通常始终都会包含position数据,其它的属性数据用来决定顶点最终呈现在屏幕上的颜色数据。
三、顶点着色-OpenGL渲染管线的第一步
对于绘制命令传输的每个顶点,OpenGL都会调用一个顶点着色器来对顶点进行数据处理,在顶点着色器阶段顶点会经过一系列的空间变换转换为齐次坐标。
四、细分着色器
顶点着色器处理了每个顶点关联数据之后,若果被激活了的话,细分着色器将会进一步处理数据,细分着色器会使用面片(patch)来描述物体,将会使用相对简单的面片几何体连接完成细分,结果将使得几何图元数量增加,模型会更加平滑。
五、几何着色
如果被激活的话,几何着色阶段允许光栅化之前对每个图元更进一步处理。
六、图元装配
这些顶点构成的几何图元的所有信息也会被传输到OpenGL,图元装配阶段将这些顶点与相关的几何图元之间组织起来,准备下一阶段的裁剪和光栅化工作。