GLSL编译器是否经过了很好的优化

时间:2014-03-13 13:21:35

标签: c++ opengl glsl compiler-optimization

最新的GLSL编译器是否智能/优化?

换句话说,如果我没脑子并且写下面的东西,最近的编译器会节省我的时间并优化掉不必要的代码,或者我应该总是小心我写的东西?

// All of the values are constants

if (3.7 == 3.7) // Will the condition be executed or removed at build time?
   x++;

// Will this whole block be entirely removed? (or should I use macros)
if (1 == 2)
    x++;

for (i = 0; i < 0; ++i) // Remove this
    x++;

for (i = 0; i < varA * varB; ++i) // Compute varA * varB once, outside the loop
    x++;

vec3 v = vec3(0);
if (length(v) > 0) // Remove
    x++;

float p = mix(varA, varB, 1); // p = varB

float p = 5;
p *= uniform * 0; // Just set a = 0 from the start

float p = 5;
p *= 1; // Remove that

现在还有很多我无法解决的问题,但你应该明白这一点。

此外,最近的编译器可以自动检测不太明显的优化,如下所述: http://www.opengl.org/wiki/GLSL_Optimizations

是否存在“编译时间”与“优化时间”之间的已知权衡,由实现者或规范设置?

1 个答案:

答案 0 :(得分:6)

GLSL编译器在浮点优化方面非常保守。您无法确定任何特定的优化。经验法则是:优化您可以做的任何事情,并且不希望得到GLSL编译器的任何帮助。

阅读Emil Persson撰写的Low-Level Thinking in High-Level Shading Languages,了解有趣的细节和案例研究。

P.S:这个答案可能听起来很悲观。但是,GLSL编译器仍然在优化代码方面做了很多工作。只是不要指望它并尽力而为。