WebGLRenderingContext中异步错误的可能来源?

时间:2015-09-04 16:18:39

标签: javascript asynchronous three.js webgl

我正在运行一个动画循环,其中我收到的错误是...

GL ERROR :GL_INVALID_OPERATION : glDrawElements: Source and destination textures of the draw are the same.

在2到3个动画帧请求之后会弹出此错误,具体取决于我是刷新还是刷新屏幕 - 即使这样,错误的时间也不一致。硬刷新有时可能会延迟错误显示直到3帧请求之后,但刷新和硬刷新的大部分时间都会在2帧请求后显示错误。基于这些观察,问题似乎是在异步组件中。我也有一个更简单的玩具版本的循环运行没有任何错误。我越来越多地简化了错误的程序(它现在只是显示一个不移动的立方体),但仍然无法找到问题的根源。

该程序非常复杂,所以很难确定在这里展示什么代码,所以相反我希望得到一个答案,可以教我一些关于这样一般问题的解决方法,所以我可以随时应用它遇到类似情况:我的问题是,对于这样的问题,程序中的最佳候选区域是什么?知道了,我可以集中精力。

我希望这是有道理的 - 如果您需要进一步澄清,请告诉我。谢谢!

更新

  • 这看起来非常基本,但我会补充一点,当我在场景中没有任何对象(立方体,轴助手等)并且让其他所有内容保持不变时,错误就会消失。

    < / LI>
  • 另外,我想知道是否因为丢失了上下文而发生这种错误?与so一样。

1 个答案:

答案 0 :(得分:0)

您可能需要发布您的代码,但只是猜测......

首先,错误正是它所说的。您有一个附加到当前帧缓冲区的纹理。同样的纹理也被分配给一些纹理单元。

为什么间歇性地发生我只能猜测。如果您从图像或甚至从dataURL加载纹理,它们会加载异步。在缓存中或者如果你在本地测试它们会很快加载。所以,我的猜测是你没有正确设置每一帧的纹理单元(为着色器使用的每个纹理单元调用gl.activeTexturegl.bindTexture)。当您的图像最终被异步下载时,您可以调用gl.bindTexture来上传纹理。最终会将纹理分配给当前活动纹理单元,并弄乱您的设置。