Javascript WebGL:gl.copyTexImage2D竞赛条件

Javascript WebGL:gl.copyTexImage2D竞赛条件,javascript,webgl,Javascript,Webgl,我继承了一些WebGL代码,这些代码显示了由竞争条件引起的渲染工件的迹象。该问题仅出现在某些硬件上(在Nvidia专用设备上,但在英特尔集成图形上不存在),似乎与gl.copyTexImage2D有关 问题代码的结构如下所示: <draw things> // render to frame buffer gl.copyTexImage2D(...); // copy frame buffer to texture <draw more things

我继承了一些WebGL代码,这些代码显示了由竞争条件引起的渲染工件的迹象。该问题仅出现在某些硬件上(在Nvidia专用设备上,但在英特尔集成图形上不存在),似乎与
gl.copyTexImage2D
有关

问题代码的结构如下所示:

<draw things>             // render to frame buffer
gl.copyTexImage2D(...);   // copy frame buffer to texture
<draw more things>        // render to frame buffer
<bind texture to uniform> // start using texture
<draw overlays>           // render to frame buffer using data from the texture
//渲染到帧缓冲区
gl.copyTexImage2D(…);//将帧缓冲区复制到纹理
//渲染到帧缓冲区
//开始使用纹理
//使用纹理中的数据渲染到帧缓冲区
不幸的是,绘制的覆盖显示的瑕疵表明从帧缓冲区复制的纹理中的数据不正确。同样,这在某些硬件上工作得很好,而在另一个硬件上却失败了

我可以通过在
gl.copyTexImage2D(…)
之后添加对
gl.flush()
(或
gl.finish()
的调用来解决此问题。虽然这解决了我的问题,但我仍然想知道是WebGL实现中的错误,还是代码中的错误


有什么想法吗?非常感谢

就OpenGL而言(我对WebGL的细节不太确定),glCopyTexImage插入了一个同步点,因此那里不应该有竞争条件。然而,出于性能原因,我不会有一个glCopyTexImage在那里无论如何。相反,我会准备第二个FBO和渲染目标,执行glBlitFrameBuffer,切换到第二个帧缓冲区并继续在那里渲染。这通常会为您提供更好的批处理,并且很可能会避免您遇到的问题


当然,您没有使用纹理作为源渲染到帧缓冲区,因为它被选为目标。是吗?

谢谢你的回复!我还希望有一个同步点,这就是我感到困惑的原因。不,我们不是在读和写同样的纹理。仅对默认帧缓冲区进行渲染。还感谢您提供有关
glCopyTexImage
的信息,不幸的是,您还没有进入WebGL。@karhu:我想您所说的“还没有成功”是指
gl.BlitFrameBuffer
(这是WebGL 2.0规范的一部分),而不是copyTexImage。