在GLSL中传递值的最快方法是什么?

在GLSL中传递值的最快方法是什么?,glsl,Glsl,在GLSL着色器中,出于各种原因,我通常需要两个函数来修改单个值(例如,片段着色器使用四个函数来应用照明、纹理、镜面反射和雾)。我可以想出至少三种方法来传递这些值进行修改: 为每个函数使用inout参数 将该值作为参数中的传递,并使用返回值(这有一个明显的缺点,即我只能使用一个值) 使用每个函数修改的全局变量 我是否应该期望这些方法之间存在实际差异?有些可能比其他的更快吗?有些比其他更兼容吗?还有其他区别吗?还是其他方法 或者我可以简单地从风格上选择我最喜欢的一个吗?这种优化主要取决于底层的GL

在GLSL着色器中,出于各种原因,我通常需要两个函数来修改单个值(例如,片段着色器使用四个函数来应用照明、纹理、镜面反射和雾)。我可以想出至少三种方法来传递这些值进行修改:

  • 为每个函数使用
    inout
    参数
  • 将该值作为参数中的
    传递,并使用返回值(这有一个明显的缺点,即我只能使用一个值)
  • 使用每个函数修改的全局变量
  • 我是否应该期望这些方法之间存在实际差异?有些可能比其他的更快吗?有些比其他更兼容吗?还有其他区别吗?还是其他方法


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

    这种优化主要取决于底层的GLSL编译器。在不同的GPU上配置着色器:AMD、nVidia、Intel,并选择最佳代码路径

    优化你的算法。然后优化您发现的任何其他瓶颈。完成所有这些之后,您可以考虑在给定的编译器上修改参数的方法最有效(因为它将依赖于编译器)。一般来说,你会从中得到精确的结果。如果你在任何给定的程序阶段只有一个着色器,那么你描述的三种方法很可能最终是相同的。如果将多个着色器链接到单个阶段,则使用全局着色器可能会有所不同(更好或更糟)。与往常一样,您需要分析以找出不同之处(如果有的话)以及瓶颈所在。此外,对于#2,您可以使用
    out
    参数(有效地)获取额外的返回值。