当不使用增量操作员时,GLSL/WebGL为循环错误



我正在尝试在片段着色器中进行循环,并收到以下错误。我真的很困惑,因为这个错误似乎完全无关。

[.Offscreen-For-WebGL-0x7f841f04f600]GL ERROR :GL_INVALID_OPERATION : glDrawArrays: Source and destination textures of the draw are the same.

当我更改时,错误到达

for(float j = 0.0 ; j < particlesPerCell; j++){

to

for(float j = 0.0 ; j < particlesPerCell; j = j + 1.0){

有什么原因吗?它与J 完全可以正常工作,而不是J = J 1.0。这不是一个真正的问题,但是看起来真的很奇怪,并且想知道是否有人可以解释这一点。我尝试在线寻找,但找不到任何答案。

我现在自己尝试过。在循环中使用i = i + 1.0时,我也会遇到错误,但是我会遇到不同的错误:'=' : Invalid operator

我在GLSL文档中找不到有关此不允许在循环表达式中允许的任何内容。

所以我的猜测是这可能取决于平台。它可能是针对性能进行优化的循环表达式。但是,优化除了i++i += 1和类似表达式外不会处理任何其他表达式。这可能是因为优化将循环展开到语句列表中,而仅使用任何类型的循环表达式就不可能。

错误消息说您正在将着色器的输出写入缓冲区/纹理,您也将其用作同一渲染中的输入。

j++j = j + 1.0应该在for循环中具有相同的结果,因此我的猜测是您的其余代码中有问题。真正的问题是为什么该错误并未一直显示。

您需要复制JSFIDDLE中的错误才能让我们看到

如果可能
const int particlesPerCell = 1000;
for(int j = 0; j < particlesPerCell; j++){
    …
}

最新更新