具有3个相同值的变化的三角形.. GPU内插/废弃性能?

Man*_*idt 7 opengl directx shader webgl

我有一个简单的问题,在3个顶点从顶点着色器输出相同的情况下,我无法找到关于GPU行为的可靠事实. GPU是否注意到这种情况,还是在它甚至不需要时尝试插值?

这可能很有趣,因为在某些情况下,您希望每个三角形的片段着色器中有一个可变的变化.请不要只是猜测,尝试提出参考或至少为什么你认为这样或那样的原因.

Cor*_*bie 2

无论是否需要,GPU 都会进行插值。

原因很简单:检查变量是否已更改的成本非常高。


着色器是小程序,在不同的 GPU 核心上同时执行。因此,如果您想避免两个不同的内核计算相同的值,则必须“保留”输出变量。因此,您需要每个内核都可以读取的附加数据结构(例如标志或互斥体)。在您的情况下,这意味着三个不同的核心必须读取相同的标志,并且其中第一个核心必须保留它(如果尚未保留)。

这必须以原子方式发生,这意味着保留核心必须是一次唯一设置标志的核心。为此,所有其他核心必须停止一会儿。由于您不知道哪些核心正在计算顶点着色器,因此您必须停止所有其他核心(在 GTX Titan 上,这将是其他 2687 个核心)。

此外,当设置变量并渲染新帧时,所有标志都必须重置,因此标志的竞争可以再次开始。

总而言之:您的 GPU 中需要额外的硬件,这不仅昂贵而且会减慢渲染管道的速度。


程序员的工作是避免多个着色器产生相同的输出。因此,如果您正确地完成工作,这种情况就不会发生,或者您知道,避免它(在 CPU 上)比忽略它的成本更高。

一个例子是不同细节级别的拼接(例如在高度图上),其中大多数方法都会创建一些片段两次。这对渲染性能的影响非常小,但需要大量的 CPU 时间来避免。