GLSL函数调用与内联之间的性能差异

5

如果像a+操作符这样的简单运算被包裹进一个函数中,会不会在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);
    // [...]
}

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

2个回答

4
当我几年前测试这个特定案例时,我发现在函数和内联代码之间没有性能差异。如果我没记错的话,当时我使用了来自Nvidia和/或AMD的工具来查看从GLSL文件生成的汇编代码。这也证实了无论我是否使用函数,汇编都是相同的。这表明函数被内联。
我建议你自己查看着色器两个版本的汇编代码以说服自己。这个问题(https://gamedev.stackexchange.com/questions/65695/aquire-disassembly-of-shader-code)解释了一些获取此信息的方法。

0

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

话虽如此,你可以“预先优化”你的GLSL代码,以便在代码发送到编译器之前执行这些类型的优化(通常在离线状态下完成)。glsl-optimizer 经常用于此目的,并内置到Unity引擎中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接