几何着色器阶段

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

显示几何着色器输入基元示例的关系图。

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

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

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

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

  • 点子画面分割:着色器采用单个顶点, (两个输出三角形生成四个顶点,) 表示具有任意 texcoords、法线和其他属性的四个四角。

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

  • 毛皮/鳍生成:可能使用不同的纹理呈现多个偏移量, (挤压面) 模拟毛皮的乳化效果。 鳍是延伸的边缘,如果角度不倾斜,通常会淡出。 鳍用于使对象在倾斜角度上看起来更好。

  • 阴影卷生成:用于确定是否延伸的相邻信息。

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

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

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

由于每次调用几何图形着色器都会产生不同数量的输出,因此在此阶段,并行调用硬件比并行运行其他管道阶段 ((如顶点或像素着色器阶段)) 更困难。 虽然硬件实现将并行运行几何着色器调用,但完成并行几何着色器调用所需的复杂缓冲意味着应用程序不应要求在几何着色器阶段可实现的并行级别与其他管道阶段相同。 换句话说,几何着色器可能会成为管道中的瓶颈,具体取决于几何着色器具有的程序负载。 但是,目标是使用几何着色器功能的算法仍然比必须模拟无法以编程方式生成几何图形的硬件上的行为的应用程序更高效。

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