GLSL:为什么const int数组比普通数组慢得多?

时间:2011-12-01 08:36:56

标签: performance opengl const glsl

我有一个用glsl编写的OpenGL着色器。我在标题的顶部有一个全局定义的数组,如下所示:

const int permutations[256] = int[256](
    64 ,  34 ,  36 , 137 , 120 , 122 , 246 ,  46 ,  79 ,  10 ,  37 , 181,
    ...
    );

当我启动程序时,它非常慢,这意味着当使用着色器显示一个简单的茶壶时,我每秒只有1帧。

但是,只要我从上面的声明中删除“const”,一切正常,我就会以交互式帧率恢复。

所以,“问题”实际上已经解决了......但是我想知道为什么会出现这种情况?非常违反直觉,根据我的经验,使用consts通常会使程序更快


更新

我实际上尝试使用Uniform而不是const int数组,其他地方的代码完全相同。但是,在这种情况下,编译着色器会崩溃:

Internal error: assembly compile error for fragment shader at offset
34609:
-- error message -- line 651, column 22:  error: invalid local parameter number

1 个答案:

答案 0 :(得分:2)

这很奇怪。很可能你有驱动程序问题。我在Windows下的Nvidia 540M上运行了包含着色器代码,让它在循环中运行。在那个循环中,我调用着色器程序一次并测量时间(如果着色器正常工作,我也用变换反馈检查过)。大多数周期以2-3毫秒结束,一些峰值在25毫秒。但是,删除const标识符对性能没有影响。这些值是非常小的值,但根据您的描述,即使在这里,const的性能影响也应该是可观察的。

#version 150
const int permutations[256] = int[256](
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
...
246, 247, 248, 249, 250, 251, 252, 253, 254, 255
);

flat out int num1[32];

void main(){
    for(int i = 0; i < 32; i++){
        num1[i] = (permutations[2*i]+permutations[2*i+1])*(permutations[2*i+2]+permutations[2*i+3]);
    }
}

也许如果你不介意我可以尝试在我的硬件上运行你的程序,但它必须为windows编译,请包含所有动态库。