几何着色器为什么在顶点着色器之后处理?

11
OpenGLDirect3D渲染管线中,几何着色器在顶点着色器之后、片元/像素着色器之前进行处理。显然,在片元/像素着色器之后处理几何着色器是没有意义的,但我想知道为什么不将其放置在顶点着色器之前。
从软件/高级别的角度来看,这似乎更有意义:首先运行几何着色器以创建所有所需的顶点(并且丢弃任何仅与几何着色器相关的数据),然后对所有创建的顶点运行顶点着色器。明显的缺点是现在必须在新创建的每个顶点上运行顶点着色器,但是在当前管线中,需要在几何着色器中为每个顶点运行任何逻辑,因此在这里没有太大的性能损失。
我假设由于几何着色器在两个管线中都处于此位置,因此存在硬件原因或非明显的管线原因,这使得它更加合理。
我知道在运行几何着色器之前需要进行多边形链接(如果它以单个点作为输入,则可能不需要?),但我也知道它需要在几何着色器之后运行,所以在这些阶段之间运行顶点着色器是否仍然有意义?
1个回答

8

这主要是因为“几何着色器”是微软提出的一个相当愚蠢的词汇选择。它应该被称为“原始着色器”。

几何着色器使原始组装阶段可编程化,但在计算输入顶点流之前,您无法组装原始形状。由于可以将一个输入原始类型转换成完全不同的类型(通常需要计算额外的顶点),因此功能有些重叠。

这些额外发射的顶点不需要在管道中向后传递到顶点着色器阶段 - 它们在调用几何着色器期间完全计算。这个概念应该不会太陌生,因为镶嵌控制和评估着色器在形式和功能上也非常像顶点着色器。

有许多顶点变换阶段,我们所谓的顶点着色器只是冰山一角。在现代应用程序中,您可以期望顶点着色器的输出经过多个其他阶段,然后才能得到最终用于光栅化和像素着色(这也是一个名称不当的阶段)的顶点。


1
无论您是否喜欢这个名称,primitive shader 的问题在于缩写“PS”可能会与像素着色器产生歧义。“GS”(几何着色器)至少与“PS”(像素着色器)、“VS”(顶点着色器)、“HS”(曲面细分着色器)、“DS”(域着色器)和“CS”(计算着色器)不同。 - Chuck Walbourn
2
@ChuckWalbourn:是的,这让我得出结论...如果他们把像素着色器称为片段着色器,我们会好很多。OpenGL有一个非常好的特性,即每个着色器阶段都以其输出的数据命名(除了几何着色器,但它们是在追随微软的领导)。D3D将一些着色器命名为其输出,一些命名为其输入,其他则没有描述性。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接