02-OpenGL中的逐个图元处理
13.1 OpenGL中的逐个图元处理
几何着色器阶段位于曲面细分和光栅化之间,位于用于图元处理的管线段内(见图2.2)。顶点着色器允许一次操作一个顶点,而片段着色器一次可以操作一个片段(实际上是一个像素),但几何着色器却可以一次操作一个图元。
回想一下,图元是OpenGL中绘制对象的基本元件。只有少数几种类型的图元;我们将主要关注操纵三角形图元的几何着色器。因此,当我们说几何着色器可以一次操作一个图元时,我们通常意味着着色器一次可以访问三角形的3个顶点。几何着色器允许一次性访问图元中的所有顶点,然后:
- 输出相同的图元保持不变;
- 输出修改了顶点位置的相同类型图元;
- 输出不同类型的图元;
- 输出更多的其他图元;
- 删除图元(根本不输出)。
与曲面细分评估着色器类似,可以在几何着色器中将传入的顶点属性作为数组进行访问。但是,在几何着色器中,传入属性数组仅索引到图元尺寸那么大。例如,如果图元是三角形,则可用索引为0、1、2。使用预先定义的数组gl_in访问顶点数据本身,如下所示。
gl_in[2].gl_Position // 第三个顶点的位置
与曲面细分评估着色器类似,几何着色器输出的顶点属性都是标量。也就是说,输出是形成图元的各个顶点(它们的位置和其他属性变量,如果有的话)的流。
有一个布局修饰符用于设置图元输入/输出类型和输出大小。特殊的GLSL命令EmitVertex()指定了将要输出一个顶点。特殊的GLSL命令EndPrimitive()表示一个特定的图元构建完成。
有一个内置变量gl_PrimitiveIDIn,它保存当前图元的ID。ID从0开始,并计数到图元总数减1。
我们将探讨四种常见的操作类型:
- 修改图元;
- 删除图元;
- 添加图元;
- 更改图元类型。