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

lit*_*ast 7 opengl pipeline direct3d geometry-shader vertex-shader

OpenGLDirect3D渲染管道中,几何着色器在顶点着色器之后和片段/像素着色器之前处理.现在显然在片段/像素着色器没有意义之后处理几何着色器,但我想知道为什么不把它放在顶点着色器之前?

从软件/高级角度来看,至少,它似乎更有意义:首先运行几何着色器以创建所需的所有顶点(并转储仅与几何着色器相关的任何数据),然后运行这样创建的所有顶点上的顶点着色器.有一个明显的缺点,现在必须在每个新创建的顶点上运行顶点着色器,但是在当前管道中需要为几何着色器中的每个顶点运行需要完成的任何逻辑. ,据推测; 所以那里没有太大的表现.

我假设,因为几何着色器在两个管道中处于这个位置,所以存在硬件原因,或者说它更有意义的非显而易见的管道原因.

(我知道在运行几何着色器之前需要进行多边形链接(如果它需要单点作为输入,可能不会这样做)但是我也知道它需要在几何着色器之后运行,所以它仍然不会在这些阶段之间运行顶点着色器的感觉?)

And*_*man 6

这基本上是因为“几何着色器”在微软方面是一个非常愚蠢的词选择。它应该被称为“原始着色器”。

几何着色器使图元组装阶段可编程,并且在计算顶点输入流之前无法组装图元。功能上存在一些重叠,因为您可以采用一种输入原始类型并输出一种完全不同的类型(通常需要计算额外的顶点)。

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

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

  • @ChuckWalbourn:是的,这让我回到了我的结论..如果他们将像素着色器称为片段着色器,我们的形状会好得多。OpenGL 有一个非常好的特性,即每个着色器阶段都以其输出的数据命名(几何着色器除外,但它们遵循了 Microsoft 的做法)。D3D 以输出命名一些着色器,一些以输入命名,另一些以非描述性方式命名。 (2认同)