在我的WEBGL着色器中,我使用未知长度的循环(在编译时)。
do {
sample = texture(uTex, posXY).a;
accumulated += aSample * uAMultiplier;
} while (accumulated < 0.8);
这在OpenGL浏览器上可以正常工作,但是默认情况下,Windows chrome / ff使用angle来展开循环,这在这种情况下是不可能的,从而导致编译错误。
错误:生成错误编译
错误:无法链接程序
信息日志:
C:\ fakepath(110,28-106):错误X4014:在具有发散流控制的循环内不能进行梯度运算C:\ fakepath(59,12-96):警告X3570:梯度指令在具有不同迭代次数的循环中使用,迫使循环展开
C:\ fakepath(118,1-82):错误X3511:无法展开循环,循环似乎没有及时终止(1024次迭代)
是否有解决方案来防止展开或以其他方式绕过循环?
答案 0 :(得分:1)
您可以尝试使用退出声明一个静态循环。例如
float accumulated = 0.0;
#define ITERATION_LIMIT 100;
for (int i = 0; i < ITERATION_LIMIT; ++i) {
sample = texture(uTex, posXY).a;
accumulated += aSample * uAMultiplier;
if (accumulated >= 0.8) {
break;
}
}
当然,最好为限制选择一个合理的数字