在webgl像素着色器中,按照我的理解,所有函数都是内联的,但是您可以将参数标记为in或inout,这意味着它们的值可以更改,但该值不会在函数调用之外持续存在。 >
,这是否意味着着色器必须复制该值才能使函数使用in值?

着色器编译器/优化器是否足够聪明,可以知道何时进行着色不需要复制,还是最好只将所有参数标记为inout并确保(而不要修改)您不想修改的参数(如果主要考虑性能)?

谢谢!

#1 楼

几年前,我使用着色器编译器堆栈的经验是它们非常激进,我怀疑您是否会看到性能差异,但是我建议您进行尽可能多的测试。

我通常会建议在语言允许的范围内向编译器(和人类读者)提供更多信息,并根据其用法标记参数。与编译器相比,将in-only参数视为in / out对人类来说更容易出错。

一些细节:着色器几乎完全使用变量寄存器运行(我使用的体系结构最多支持256 32位寄存器)-溢出非常昂贵。物理寄存器在着色器调用之间共享-将其视为HyperThread意义上的线程共享寄存器池-并且如果可以使着色器使用较少的寄存器,则并行性更高。结果是着色器编译器努力工作以最大程度地减少使用的寄存器数量-当然不会溢出。因此,内联是常见的,因为无论如何希望在整个着色器上优化寄存器分配。