gpt4 book ai didi

opengl - GLSL 着色器在需要时不展开循环

转载 作者:行者123 更新时间:2023-12-01 18:30:02 24 4
gpt4 key购买 nike

我的 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的大小问题没有出现。
视口(viewport)尺寸为 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];

最佳答案

我只是在这里总结评论的答案,这样就不会再显示为未答复。

"#pragma optionNV (unroll all)"

修复了 nvidia 上的当前问题。

一般来说,GLSL 编译器非常依赖于实现。精确到 32 时下降的原因很容易通过编译器启发式来解释,例如“不要展开超过 32 的循环”。此外,巨大的速度差异可能来自使用常量的展开循环,而动态循环将需要可寻址的数组内存。另一个原因可能是,当展开死代码消除时,不断的折叠会将整个循环减少到零。

解决此问题的最便携方法是手动展开,甚至更好的手动持续折叠。在片段着色器中计算可以在外部计算的常量总是有问题的。有些司机可能会在某些情况下发现它,但最好不要依赖这一点。

关于opengl - GLSL 着色器在需要时不展开循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com