几何着色器阶段

几何着色器(GS)阶段使用顶点作为输入运行应用程序指定的着色器代码,并且可以在输出上生成顶点。 与在单个顶点上运行的顶点着色器不同,几何着色器的输入是完整基元的顶点(即线条的两个顶点、三角形的三个顶点或点的一个顶点),加上与之相邻的基元边缘处的顶点数据(即线条的另外两个顶点或三角形的另外三个顶点)。 下图展示了输入到几何着色器的基元示例。

几何着色器输入基元示例图。

几何着色器的另一个输入是输入汇编程序(IA)自动生成的基元 ID。 基元 ID 允许几何着色器提取或计算每个人脸数据(如果需要)。

几何着色器阶段可以输出多个顶点以形成单个所选拓扑。 可用的 GS 输出拓扑是 tristriplinestrippointlist。 几何着色器发出的基元数可能会有所不同,但几何着色器可以发出的最大顶点数必须以静态方式声明。 几何着色器发出的条带长度可以是任意的(有 剪切 命令)。

几何着色器的输出可以发送到光栅器和内存中的顶点缓冲区。 发送到内存的输出将扩展到单个点、线条和三角形列表(类似于将输出传递到光栅器的方式)。

几何着色器阶段可以实现以下算法:

  • 点精灵细分:着色器采用一个顶点并生成四个顶点(即两个输出三角形),表示一个四边形的四个角,其具有任意的纹理坐标、法线和其他属性。

  • 宽线细分:着色器接收两个线顶点(LV0 和 LV1),并生成四个顶点以代表加宽后的线条。 此外,几何着色器可以使用相邻的线段顶点(AV0 和 AV1)在线段端点上执行斜接。

  • 毛皮/鳍生成:渲染多个可能具有不同纹理的偏移(拉伸面)以模拟毛皮的视差效果。 鳍片是挤出的边缘,如果角度不倾斜,经常会逐渐消失。 鳍片用于使对象在倾斜角度上更美观。

  • 阴影体积生成:用于确定是否拉伸的相邻信息。

  • 单次传递渲染到多个纹理立方体面:基元被投影并发送到像素着色器六次。 每个基元都附带一个呈现目标数组索引,该索引选择立方体面。

  • 将条心坐标设置为基元数据,以便像素着色器可以执行自定义属性内插。

  • 病理情况:应用程序生成一些几何图形,然后生成几何图形的 n 补丁,然后将阴影卷从该几何图形中延伸出来。 对于此类情况,多次传递是一种解决方案,能够将顶点和图元数据输出到流中并将数据传回。

由于对几何着色器的每次调用都会产生不同的输出,因此在此阶段对硬件的并行调用比并行运行其他管道阶段(如顶点或像素着色器阶段)更困难。 尽管硬件实现将并行运行几何着色器调用,但完成并行几何着色器调用所需的复杂缓冲意味着应用程序不应要求在几何着色器阶段实现的并行度与其他管道阶段一样多。 换句话说,几何着色器可能会成为管道中的瓶颈,具体取决于几何着色器具有的程序负载。 但是,目标是利用几何着色器功能的算法能够比需要在不具备程序生成几何图形能力的硬件上进行模拟的应用程序运行得更高效。

Direct3D 运行时调用以下驱动程序函数来创建、设置和销毁几何着色器: