2011-10-31 64 views
4

在GLSL着色器中,由于各种原因(例如使用四个函数应用光照,纹理,speculars和雾等)的片段着色器,我经常需要一些函数来修改单个值。我可以想到至少有三种方法可以将这些值传递给修改:在GLSL中传递值的最快方式是什么?

  1. 使用inout参数为每个功能。
  2. 将该值作为in参数传递,并使用返回值(显然缺点是我只能使用一个值)。
  3. 使用每个函数修改的全局变量。

我应该期待这些方法之间有什么实际差异吗?有些可能比别人更快?比其他更兼容吗?还有其他的区别吗?还是其他方法呢?

或者我可以简单地选择一个我最喜欢的风格吗?

+4

优化您的算法。然后优化您发现的任何其他瓶颈。做完所有这些之后,_then_您可以考虑修改参数的哪些方法在给定的编译器上工作得最好(因为它将依赖于编译器)。一般来说,你会精确地摆脱这一点。 –

+1

如果在任何给定的程序阶段只有一个着色器,那么描述的三种方法可能最终都是相同的。如果您将多个着色器链接到单个阶段,那么使用全局可能会不同(更好或更糟)。与往常一样,您需要通过简介来弄清楚什么(如果有的话)是不同的以及瓶颈在哪里。 –

+1

此外,对于#2,您可以使用'out'参数来获得(有效)额外的返回值。 –

回答

0

这种优化主要依赖于底层的GLSL编译器。在不同的GPU上分析着色器:AMD,nVidia和Intel,并选择最佳代码路径。

相关问题