首页 > 解决方案 > 使用 ANGLE 时防止在着色器程序中展开循环

问题描述

在我的 WEBGL 着色器中,我使用了未知长度的循环(编译时)。

    do {
        sample = texture(uTex, posXY).a;
        accumulated += aSample * uAMultiplier;
    } while (accumulated < 0.8);

这在 OpenGL 浏览器上按预期工作,但默认情况下 windows chrome/ff 使用角度,展开循环,在这种情况下这是不可能的,导致编译错误。

错误:编译生成
错误错误:无法链接程序
信息日志:
C:\ fakepath(110,28-106):错误X4014:不能在具有发散流控制的循环内进行梯度操作

C:\fakepath(59,12-96): 警告 X3570: 梯度指令在循环中使用不同迭代,强制循环展开
C:\fakepath(118,1-82): 错误 X3511: 无法展开循环,循环似乎没有及时终止(1024 次迭代)

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

标签: glsldirectxhlslanglewebgl2

解决方案


您可以尝试声明一个带有出口的静态循环。例如

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

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


推荐阅读