4

如果像 + 运算符这样简单的东西被包装到一个函数中,它会在 GLSL 中产生性能差异吗?

因此,例如这两种情况:

示例 1:

in uniform float uValueA;
in uniform float uValueB;

void main()
{
    float value = uValueA + uValueB;
    // [...]
}

示例 2:

in uniform float uValueA;
in uniform float uValueB;

float addValues(float a, float b)
{
    return a + b;
}

void main()
{
    float value = addValues(uValueA, uValueB);
    // [...]
}

编译的最终产品有什么不同吗?还是它们会产生相同数量的指令和性能?

4

2 回答 2

2

几年前我测试这个特定案例时,我发现函数或内联代码之间没有性能差异。如果我没记错的话,当时我使用 Nvidia 和/或 AMD 的工具来查看从 GLSL 文件生成的汇编代码。这也证实了无论我是否使用函数,程序集都是相同的。这表明函数是内联的。

我建议你自己看看你的着色器的两个版本的汇编代码来说服自己。这个问题(https://gamedev.stackexchange.com/questions/65695/aquire-disassembly-of-shader-code)解释了一些获取这些信息的方法。

于 2017-12-08T18:38:25.183 回答
0

您基本上不能对着色器的优化做出任何假设,因为编译是特定于供应商的。编译器会优化这个非常简单的情况,并内联函数,使两者等价,这是有道理的,但这绝不能保证。理论上,他们可以为每个函数调用插入一百万个无操作(尽管编写他们的编译器的人可能会被解雇:))。

也就是说,您可以“预优化”您的 GLSL 代码,以便在将代码发送到编译器之前执行这些类型的优化(通常离线完成)。glsl -optimizer经常用于此目的,并内置在 Unity 引擎中。

于 2017-12-08T04:13:48.830 回答