几何着色器阶段

几何着色器 (GS) 阶段运行应用程序指定的着色器代码,并将顶点作为输入,并能够在输出中生成顶点。

几何着色器

与在单个顶点上运行的顶点着色器不同,几何着色器的输入是完整基元的顶点 (线条的两个顶点、三个顶点的顶点或点) 的单顶点。 几何着色器还可以引入边缘相邻基元的顶点数据,因为输入 (一条线的另外两个顶点,另外三个顶点用于三角形) 。 下图显示了一个三角形和一条具有相邻顶点的线条。

三角形和具有邻近顶点的线的图示

类型
TV 三角形顶点
AV 相邻顶点
LV 线顶点

 

几何着色器阶段可以使用 IA 自动生成SV_PrimitiveID 系统生成的值 。 这使得获取或计算每基元数据成为可能(如果需要)。

几何着色器阶段能够输出构成单个选定拓扑的多个顶点, (GS 阶段输出拓扑可用为:tristrip、折线图和点列表) 。 在几何着色器的任何调用中,发出的基元的数目可以自由地变化,但是必须静态地声明可发出的顶点的最大数目。 从几何着色器调用发出的带长度可以是任意的,并且可以通过 RestartStrip HLSL 函数创建新带。

几何着色器输出可经由流输出阶段馈送到光栅器阶段和/或内存中的顶点缓冲区。 馈送到内存的输出可扩展到单个点/线/三角形列表(与将传递到光栅器的列表一致)。

当几何着色器处于活动状态时,每个在管道中传递的或之前在管道中生成的基元都将调用一次几何着色器。 将几何着色器的每次调用都视为输入调用基元的数据,无论它是单点、单线还是单个三角形。 在管道中较早的三角形带将导致对带中每个单独三角形的几何着色器的调用(就像带被展开为三角形列表一样)。 单个基元中每个顶点的所有输入数据都 (可用,即三角形) 的 3 个顶点,以及相邻顶点数据(如果适用/可用)。

几何着色器通过将顶点附加到输出流对象来一次输出一个顶点。 流的拓扑由固定声明确定,其中一个声明为:PointStream、LineStream 或 TriangleStream 作为 GS 阶段的输出。 有三种类型的流对象可用:PointStream、LineStream 和 TriangleStream,它们都是模板化对象。 输出的拓扑由它们各自的对象类型确定,而附加到流的顶点的格式由模板类型确定。 几何着色器实例的执行与其他调用是不可分割的,除了添加到流的数据是串行的。 几何着色器的给定调用的输出独立于其他调用(尽管遵循排序)。 生成三角形条的几何着色器将在每次调用时启动一个新的带。

当几何图形着色器输出被标识为系统解释值 ((例如SV_RenderTargetArrayIndex或SV_Position) )时,硬件会查看此数据,并执行一些依赖于该值的行为,此外还能够将数据本身传递到下一个着色器阶段进行输入。 当几何着色器的这种数据输出在每基元基础上对硬件有意义时(例如 SV_RenderTargetArrayIndex 或 SV_ViewportArrayIndex),而不是在每顶点基础上(例如 SV_ClipDistance[n] 或 SV_Position),则每基元数据取自针对基元发出的前导顶点。

如果几何着色器结束并且基元不完整,则几何着色器可以生成部分完成的基元。 不完整的基元被静默丢弃。 这类似于 IA 处理部分完成的基元的方式。

几何着色器可以执行加载和纹理采样操作,其中不需要屏幕空间派生对象(samplelevel、samplecmplevelzero、samplegrad)。

可在几何着色器中实现的算法包括:

  • 点精灵扩展
  • 动态粒子系统
  • 皮毛/晶粒生成
  • 阴影卷生成
  • 单程渲染到 Cubemap
  • 每基元材料交换
  • Per-Primitive材料设置 - 包括生成基元数据形式的大中心坐标,以便像素着色器可以执行自定义属性内插 (以获取高阶法线内插的示例,请参阅 CubeMapGS 示例) 。

图形管道

管道阶段 (Direct3D 10)