我有一个简单的问题,在3个顶点从顶点着色器输出相同的情况下,我无法找到有关GPU行为的可靠事实。 GPU是否注意到这种情况,或者是否尝试在甚至不需要时进行插值?
这可能很有趣,因为在某些情况下,您希望每个三角形的片段着色器中有一个可变的变化。请不要只是猜测,试着提出参考或至少为什么你认为这样或那样的理由。
答案 0 :(得分:2)
无论是否需要,GPU都会进行插值。
原因很简单:检查变量变量是否已经改变是非常昂贵的。
着色器是小程序,在不同的GPU核心上同时执行。因此,如果您希望避免两个不同的核心计算相同的值,则必须“保留”输出变量。因此,您需要一个每个核心都可以读取的额外数据结构(如标志或互斥锁)。在你的情况下,这意味着,三个不同的内核必须读取相同的标志,并且如果它尚未保留,则第一个必须保留它。
这必须以原子方式发生,这意味着保留核心必须是唯一一次设置标志的核心。为此,所有其他核心将例如必须停下来打勾。由于您不知道哪些核心正在计算顶点着色器,您必须停止所有其他核心(在GTX Titan上,这将是2687个其他核心)。
此外,当设置变量并渲染新帧时,必须重置所有标志,因此标志的竞争可以再次开始。
总结:你需要GPU中的额外硬件,这是昂贵的,并且会降低渲染管道的速度。
程序员的工作是避免多个着色器产生相同的输出。因此,如果你正确地完成了自己的工作,这种情况就不会发生,或者你知道,避免它(在CPU上)会花费更多而不是忽略它。
一个例子是不同细节层次(如高度图上),其中大多数方法都是两次创建一些片段。这对渲染性能影响很小,但需要大量的CPU时间才能避免。
答案 1 :(得分:0)
如果在OpenGL规范中没有强制要求行为,那么答案就是由实现决定。
评论和其他答案几乎肯定是因为没有相同值的优化路径,因为制作这样的路径会增加复杂性几乎没有益处。