当前位置:嗨网首页>书籍在线阅读

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。

我们将探讨四种常见的操作类型:

  • 修改图元;
  • 删除图元;
  • 添加图元;
  • 更改图元类型。