几何着色器(GS)阶段使用顶点作为输入运行应用程序指定的着色器代码,并能够在输出时生成顶点。
几何着色器
与在单个顶点上运行的顶点着色器不同,几何着色器的输入是完整基元的顶点(线条的两个顶点、三个三角形的顶点或点的单个顶点)。 几何着色器还可以将边缘相邻基元的顶点数据作为输入(一条线的另外两个顶点,三角形的附加三个顶点)。 下图显示了一个三角形和一条带有相邻顶点的线条。
类型 | |
---|---|
电视 | 三角形顶点 |
AV | 相邻顶点 |
LV | 折线顶点 |
几何着色器阶段可以使用由 IA 自动生成的SV_PrimitiveID 系统生成的值。 这允许提取或计算每个基元数据(如果需要)。
几何着色器阶段能够输出构成单个所选拓扑的多个顶点(可用的 GS 阶段输出拓扑包括:三条线、线条和点列表)。 在几何着色器的任何调用中,发出的基元数可以自由变化,但可以发出的最大顶点数必须以静态方式声明。 从几何着色器调用发出的条带长度可以是任意的,并且可以通过 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)。
可在几何着色器中实现的算法包括:
- 点子画面扩展
- 动态粒子系统
- 毛皮/芬代
- 阴影卷生成
- 单个传递呈现到多维数据集映射
- Per-Primitive 材料交换
- Per-Primitive 材料设置 - 包括生成基元数据形式的条心坐标,以便像素着色器可以执行自定义属性内插(有关高阶正态内插的示例,请参阅 CubeMapGS 示例)。
相关主题