Opengl 三个变量值相同的三角形。。GPU是否插值/浪费性能?

Opengl 三个变量值相同的三角形。。GPU是否插值/浪费性能?,opengl,directx,webgl,shader,Opengl,Directx,Webgl,Shader,我有一个简单的问题,在3个顶点具有相同的顶点着色器变化输出的情况下,我无法找到关于GPU行为的可靠事实。 GPU是否注意到这种情况,还是在不需要时尝试插值? 这可能很有趣,因为在相当多的情况下,您希望每个三角形的片段着色器中有一个常量。请不要只是猜测,试着提出参考资料或至少你认为是这样或那样的原因。GPU会进行插值,无论是否需要 原因很简单:检查变量是否已经改变是非常昂贵的 着色器是在不同GPU内核上并发执行的小程序。因此,如果您希望避免两个不同的内核计算相同的值,那么必须“保留”输出变量。因

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


这可能很有趣,因为在相当多的情况下,您希望每个三角形的片段着色器中有一个常量。请不要只是猜测,试着提出参考资料或至少你认为是这样或那样的原因。

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

原因很简单:检查变量是否已经改变是非常昂贵的


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

这必须在原子上发生,这意味着保留核心必须是一次唯一设置标志的人。要执行此操作,所有其他磁芯都必须停下来打勾。由于您不知道哪些内核正在计算顶点着色器,因此必须停止所有其他内核(在GTX Titan上,这将是2687个其他内核)

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

总而言之:您需要在GPU中添加额外的硬件,这非常昂贵,并且会减慢渲染过程


程序员的工作是避免多个着色器产生相同的输出。因此,如果你工作做得很好,这不会发生,或者你知道,避免它(在CPU上)要比忽略它花费更多


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

如果OpenGL规范中没有强制要求这种行为,那么答案是由实现决定


评论和其他答案几乎可以肯定地指出,没有针对相同值的优化路径,因为创建这样一条路径所增加的复杂性几乎没有好处

由于varying的数量是固定的,并且基本上所有的硬件都已经实现,以计算一个周期内的下一个值,那么设计一个额外的特殊情况路径肯定没有好处吗?我没有推荐人,这只是猜测。所以这不是一个答案。@ManuelArwedSchmidt:有专门的属性插值器硬件。AMD将其称为SPIs(着色器处理器插值器),在DX11着色器模型中,像素(片段)着色器能够按需请求插值工作,而不是在着色器开始工作之前完成插值工作。因此,真正智能的着色器编译器可以避免插入某些参数,除非在支持“拉模型”的硬件上执行不频繁的代码分支。因为您需要一些支持文档,而且AMD拥有光年最开放的硬件体系结构,你应该浏览一下SPI的参考资料。我无法想象通过实现它会有任何性能提升。你需要更复杂的硬件,更复杂的软件来检查,而不是仅仅去做。插值一点也不复杂。你基本上只是在每个像素上加一个常数。那么,虽然有趣,但重点是什么?可以说,你不会获得任何性能增益。即使存在正的性能差异(我诚实地认为会存在负的性能差异),但即使存在正的性能差异,与着色器的其他部分相比,它也会很小,几乎无法测量。。你会看到它们是一个单一的添加。优化添加会使代码变慢而不是变快,因为您有两个选项(1)生成没有添加的新代码。然后,您将不得不为每个变量组合生成新代码。(2) 使用一种函数指针并将其设置为无操作函数。但是,仅仅添加间接函数可能会使其速度变慢。特别是因为在真正的硬件中没有功能。