下图是图形管线的一系列处理阶段以及数据在这些处理阶段流动的简化图。虽然非常简单,但是用于展示着色器编程的一些重要概念足够了。本小节展示了OpenGL图形管线的固定功能。注意本管线只是一个抽象,不可能在所有的步骤上都满足任一特定实现。
在这里,顶点是一个属性集合,如它的空间位置、颜色、法线、纹理坐标等等。本阶段的输入是孤立的顶点属性。由本阶段的固定功能执行的操作有:
- 顶点位置变换
- 每个顶点的光照计算
- 纹理坐标生成和变换
图元装配和光栅化
本阶段的输入为经过变换的顶点和连接信息。后一部分数据(指连接信息)告诉管线,顶点是如何连接以形成一个图元的。图元的装备是在本阶段完成的。
本阶段还负责视景体裁剪和背面剔除。
光栅化确定片段和图元的像素位置。在这,片段是指一块数据,它将用于更新帧缓冲区特定位置的一个像素。一个片段不仅包括颜色、还有法线和纹理坐标,以及其他的用于计算新的像素颜色的属性。
这个阶段的输出有两部分:
- 帧缓冲区中片段的位置
- 属性(在顶点转换阶段计算得到)的片段插值
顶点转换阶段计算得到的值和顶点连接信息允许这个阶段计算出片段的相关属性。例如,每个顶点都有一个变换后的位置。当考虑组成图元的顶点时,我们能够计算该图元片段的位置。另一个例子就是颜色的使用。如果一个三角形的三个顶点的颜色各不相同,那么三角形内部的片段颜色可以通过使用三角形顶点到片段的相对距离作为权值,对三角形的顶点颜色进行插值得到。
片段纹理和着色
本阶段的输入是插值后的片段信息。在前一阶段通过插值计算得到的颜色值,在这一阶段可以和纹理单元组合在一起。纹理坐标也是在前一阶段经过插值得到的。雾效果在这一阶段应用。本阶段的最终结果就是每个片段都有一个颜色值和深度值。
光栅操作
本阶段的输入为:
- 像素位置
- 片段深度和颜色值
管线的最后一个阶段(即本阶段)对片段执行一系列的测试,也就是:
- 裁剪测试
- alpha测试
- 模板测试
- 深度测试(实际是隐藏面消除)
如果成功完成这些测试,片段信息将根据当前的混合模式用于更新像素的值。注意:因为片段纹理和着色 阶段不能访问帧缓冲区,所以混合只能在本阶段进行。并且帧缓冲区只有在本阶段是可访问的。
固定功能的可视化概观
下图展示了以上各阶段的一个可视化描述:
最近的显卡让程序员能够定义:以上所述阶段,其中的两个阶段的功能:
- 顶点着色器用于顶点变换 阶段。
- 片段着色器用于替换片段纹理和着色 阶段的固定功能。
下两节将要描述这些可编程的阶段,即顶点处理器和片段处理器。
———————————————————————————————————————————————————————————————
本文英文原文为《GLSL Tutorial – Pipleline Overview》 。
如果文中有一些地方翻译得不符合您的阅读习惯,您可以选择直接阅读英文原文,或者把您的翻译建议发给我,我一定会认真对待您的建议。