glsl - 使用 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 次迭代)
是否有防止展开或以其他方式绕过必须循环的解决方案?
解决方案
您可以尝试声明一个带有出口的静态循环。例如
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;
}
}
当然最好选择一个合理的数字作为限制
推荐阅读
- azure - 将 Azure Redis 缓存拆分为主缓存和辅助缓存
- python - 如何将子进程文本输出发送到 Tkinter 文本小部件?
- unit-testing - 如何在不构建解决方案两次的情况下运行单元测试并部署我的代码?
- javascript - 将 DateTime 对象转换为特定时区
- suitescript2.0 - NetSuite UserEventScript:TypeError:在对象标准记录中找不到函数 getSubListValue
- r - 更新软件包 igraph 和 spdep 的问题
- amazon-web-services - 如何使用 CLI/SDK 获取 Fargate 任务的 docker 映像 ID?
- machine-learning - 点燃:如何用新的数据点更新经过训练的决策树模型
- jenkins - 从 Slack 触发 Jenkins 构建
- python-3.x - 如何使 python 应用程序可分发