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

时间:2015-08-29 22:10:29

标签: opengl direct3d pipeline vertex-shader geometry-shader

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

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

我假设,由于几何着色器在两个管道中处于此位置,因此硬件原因或非显而易见的管道原因使其更有意义。

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

1 个答案:

答案 0 :(得分:4)

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

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

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

顶点变换有很多阶段,我们称之为顶点着色器只是冰山一角。在现代应用程序中,您可以预期顶点着色器的输出将经过多个额外阶段,然后才能获得光栅化和像素着色的最终顶点(名称也很差)。