Opengl 了解着色器阶段的性能影响,尤其是GS

Opengl 了解着色器阶段的性能影响,尤其是GS,opengl,graphics,glsl,shader,Opengl,Graphics,Glsl,Shader,当涉及到在管道中执行的编码算法时,我对什么更快、什么更慢感到困惑 我用一个GS做了一个程序,它似乎受到了fillrate的限制,因为计时器查询显示它在没有启用光栅化的情况下执行得更快 因此,我使用变换反馈制作了一个不同的多遍算法,每次仍然使用GS,但理论上,通过分阶段执行,总体上做的工作要少得多,而且它显著降低了填充率,因为它渲染的三角形要少得多,但在我对它的早期测试中,它似乎运行得较慢 我最初的想法是,fillrate的瓶颈被交换为调用多个draw调用的瓶颈。但另一次抽签真的有多贵?cpu和g

当涉及到在管道中执行的编码算法时,我对什么更快、什么更慢感到困惑

我用一个GS做了一个程序,它似乎受到了fillrate的限制,因为计时器查询显示它在没有启用光栅化的情况下执行得更快

因此,我使用变换反馈制作了一个不同的多遍算法,每次仍然使用GS,但理论上,通过分阶段执行,总体上做的工作要少得多,而且它显著降低了填充率,因为它渲染的三角形要少得多,但在我对它的早期测试中,它似乎运行得较慢

我最初的想法是,fillrate的瓶颈被交换为调用多个draw调用的瓶颈。但另一次抽签真的有多贵?cpu和gpu需要多少开销

然后我读到:

从来没有人指责几何体着色器速度太快。尤其是在增加几何体的大小时

你的GS是采取了一条线,不仅做了30倍的顶点数据放大,但也做了照明计算对每个新的顶点。这不会太快,很大程度上是因为缺乏并行性。每个GS调用必须执行60次照明计算,而不是让60个单独的顶点着色器调用并行执行60次照明计算

基本上,您正在几何体着色器中创建一个巨大的瓶颈

在片段着色器中放置照明内容可能会更快(是的,真的)

这让我想知道,如果几何体着色器的使用提供了总体较少的工作输出,那么它怎么可能变得更慢。我知道事情是并行执行的,但我的理解是只有一个相对较小的着色器核心组,因此启动比该组大得多的线程将导致瓶颈与程序复杂性(指令大小)乘以线程数成正比(这里使用线程来引用着色器的调用)。如果可以让某些指令在几何体着色器上的每个顶点执行一次,而不是每个片段执行一次,那么为什么会更慢


帮助我更好地理解,这样我就不会浪费时间设计效率低下的算法。

首先,顶点着色器和片段着色器只发射一个顶点或片段。几何体着色器能够在运行时发射数量可变的基本体和顶点。这意味着并行运行它们更为复杂特别是因为输出原语需要以一定的顺序着色以生成一致的最终图像。我认为GS在每个原语上执行一次,而不是在每个顶点上执行一次(除非渲染GL_点)。它会重新创建输出原语。我相信无论GS是什么,添加一个都会降低整个过程的速度。即使您最终确实放弃了原语,也会检查一段代码是否必须放弃(而不是重新发射)原语将非常耗时。您可以通过丢弃片段而不使用GS来节省时间。但是GS很有用,请不要误会。例如,对于反馈缓冲区,如果您手头没有CS,这是一个很有用的功能。