Моя 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 кадров в секунду.
Если a=26
программа работает со скоростью 20 кадров в секунду.
Если размер aa
‹=32, проблема не возникает.
Размер окна просмотра 1000x1000.
Проблема возникает только тогда, когда размер aa
> 32.
Значение a
, поскольку пороговое значение изменяется в зависимости от вызовов массива внутри цикла (aa[i]=aa[i+1]+aa[i-1]
дает другой крайний срок).
Я знаю, что gl_FragColor
устарел. Но это не проблема.
Я предполагаю, что GLSL не разворачивает цикл автоматически, если a>25 и size(aa)>32. Почему. Причина, по которой это зависит от размера массива, человечеству неизвестна.
Очень похожее поведение объясняется здесь:
http://www.gamedev.net/topic/519511-glsl-for-loops/
Разматывание цикла вручную решает проблему (3000 кадров в секунду), даже если размер 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];
#pragma
. И развертывание циклов — одна из таких директив. Конкретная непереносимая прагма, которую вы хотите, это#pragma optionNV (unroll all)
. Обычно лучше развернуть материал самостоятельно, так как AMD/Intel/... не знают, что это за#pragma
. Радости от того, что каждый поставщик реализует свой собственный компилятор - одна вещь, которая мне нравится в HLSL, Microsoft реализует один-единственный компилятор, поэтому там все довольно последовательно. - person Andon M. Coleman   schedule 01.09.2013