使用ANGLE时防止在着色器程序中展开循环

时间:2019-01-16 10:28:46

标签: glsl directx hlsl angle webgl2

在我的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次迭代)

是否有解决方案来防止展开或以其他方式绕过循环?

1 个答案:

答案 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;
  }
}

当然,最好为限制选择一个合理的数字