如果将 运算符(例如 运算符)包装到函数之类的简单的东西,它是否会在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);
// [...]
}
编译的最终产品有什么区别吗?还是它们导致相同数量的说明和性能?
几年前我测试了此特定情况时,我发现功能或在线代码之间没有性能差异。如果我没记错的话,当时我使用了NVIDIA和/或AMD的工具来查看GLSL文件生成的汇编代码。这也证实了组件是否相同,无论我是否使用了功能。这表明函数是内衬的。
我建议您自己看一下着色器的两个版本的组装代码,以说服自己。这个问题(https://gamedev.stackexchange.com/questions/65695/aquire-disassembly-of-shader-code)解释了一些获取此信息的方法。
您本质上对着色器的优化一无所知,因为汇编是特定于供应商的。编译器会优化这种非常简单的情况并将功能与两个同等的函数进行内联,但绝不可以保证,这是有道理的。从理论上讲,他们可以为每个函数插入一百万个无手机(尽管编写编译器的人可能会被解雇:)。
。也就是说,您可以"预先优化"您的GLSL代码,以便在将代码发送给编译器(通常离线完成)之前先执行此类优化。glsl射击器经常用于此目的,并内置在统一引擎中。