我的 9600GT 讨厌我。
片段着色器:
#version 130
uint aa[33] = uint[33](
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0
);
void main() {
int i=0;
int a=26;
for (i=0; i<a; i++) aa[i]=aa[i+1];
gl_FragColor=vec4(1.0,0.0,0.0,1.0);
}
如果a=25
程序以 3000 fps 运行。
如果a=26
程序以 20 fps 运行。
如果aa
不出现 <=32 的大小问题。
视口大小为 1000x1000。
仅当大小aa
大于 32 时才会出现问题。
作为阈值a
的值随循环内对数组的调用而变化(aa[i]=aa[i+1]+aa[i-1]
给出不同的截止日期)。
我知道gl_FragColor
已弃用。但这不是问题。
我的猜测是,如果 a>25 和 size(aa)>32,GLSL 不会自动展开循环。为什么。之所以取决于阵列的大小,是人类不知道的。
这里解释了一个非常相似的行为:
http ://www.gamedev.net/topic/519511-glsl-for-loops/
手动展开循环确实可以解决问题(3000 fps),即使aa
大小>32:
aa[0]=aa[1];
aa[1]=aa[2];
aa[2]=aa[3];
aa[3]=aa[4];
aa[4]=aa[5];
aa[5]=aa[6];
aa[6]=aa[7];
aa[7]=aa[8];
aa[8]=aa[9];
aa[9]=aa[10];
aa[10]=aa[11];
aa[11]=aa[12];
aa[12]=aa[13];
aa[13]=aa[14];
aa[14]=aa[15];
aa[15]=aa[16];
aa[16]=aa[17];
aa[17]=aa[18];
aa[18]=aa[19];
aa[19]=aa[20];
aa[20]=aa[21];
aa[21]=aa[22];
aa[22]=aa[23];
aa[23]=aa[24];
aa[24]=aa[25];
aa[25]=aa[26];
aa[26]=aa[27];
aa[27]=aa[28];
aa[28]=aa[29];
aa[29]=aa[30];
aa[30]=aa[31];
aa[31]=aa[32];
aa[32]=aa[33];