0%

OpenGL渲染管线简介

OpenGL渲染管线

渲染管线表示的是一次完整的图形图像渲染过程。OpenGL使用的渲染管线是可编程渲染管线,能够对图形进行复杂操作。

其基本流程如下:

  1. 顶点数组:输入的基础数据,只包含顶点信息。

  2. 顶点着色器:可编程部分,其操作对象为输入的顶点数据,通常用于调整坐标空间。

  3. 图元装配:按照装配规则和顶点顺序进行图元组装,OpenGL仅支持点、线和三角形平面。

  4. 几何着色器:可选的可编程部分,其操作对象为输入的图元数据,其可以动态的生成顶点和新的形状等。

  5. 光栅化:将输入的图元信息裁剪映射到窗口的像素上,并对图元上未处在顶点上的数据进行插值处理获得输入值。

  6. 片段着色器:可编程部分,其操作对象为光栅化输出的片段,通常用于着色。

  7. 片段测试:对输入的像素点进行测试,包括深度测试等,获得最后需要显示在屏幕上的像素。

  8. 帧缓冲:完成渲染的图片将会放置在帧缓冲区等待使用。

顶点数组

原始的顶点数据,通常包含该顶点的位置、颜色、法线向量、纹理映射等信息。

顶点着色器

顶点着色器从接收顶点数组信息,并对在各个顶点上进行处理。通常这些处理包括坐标空间转换等,同时还可以将部分数据传入后续着色器。

图元装配

在图元装配阶段,将目前已有的顶点按照一定的规则装配为图元,OpenGL支持的图元有三角形、直线或者点精灵等。

OpenGL支持的图元装配规则如下:

几何着色器

几何着色器是一个可选的着色器,可以选择是否对其进行实现。

几何着色器的操作单位为图元,其可以获得该图元所有相连顶点的输出信息,并修改顶点信息甚至创建新的顶点,从而修改图形的形状。

光栅化

在OpenGL中,光栅化能够将图元投射到二维屏幕上,从而生成一个一个的待填充像素。在这一过程中,对于非顶点的像素片段,其输入值由其关联顶点通过插值计算得到。

光栅化实质上是离散化,其将逻辑上连续的图形分割成为一个个离散的像素:

片段着色器

片段着色器作用在每一个片段上,对于每一个片段,通过对所在图元的顶点输出进行插值获得相应的输入。这一部分一般用于赋予片段颜色、添加纹理或者处理光线等。

片段测试

片段测试部分主要判断对应的片段是否需要进行显示或如何显示,其主要过程如下:

  1. 像素所有权测试:清除在当前视窗中但无法看到的像素。这种情况常见于窗口遮挡。

  2. 裁剪测试:裁剪测试用于限制绘制区域,只有在指定区域的像素才有机会被绘制。

  3. 多重采样片段操作:组合多个不同多边形产生的片段的颜色来决定最终的像素颜色,可以减少多边形边缘的走样现象。

  4. 模板测试:模板测试可以根据设置的模板对输入的图像进行过滤。当输入像素对应模板的值为0时被过滤;值为1时通过测试。

  5. 深度测试:用于测试像素深度,当深度测试关闭时,新的颜色将直接覆盖旧的颜色;深度测试开启后,只有当新像素的深度小于旧像素时,才会进行覆盖。

  6. 颜色混合:主要用于表现半透明效果,半透明时无法简单的用新颜色覆盖旧颜色,而是需要进行颜色混合。

帧缓冲

帧缓冲是一种数据缓冲区,其缓冲单元数量与一帧图像中的帧数量相同。常用的帧缓冲包含颜色缓冲、深度缓冲、模板缓冲等。