我继承了一些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.flush()
之后添加对gl.finish()
(或gl.copyTexImage2D(...)
的价值)的调用来解决问题。虽然这解决了我的问题,但我仍然想知道我是在查看WebGL实现中的错误,还是在我的代码中。
有什么想法吗?非常感谢提前!
答案 0 :(得分:2)
就OpenGL而言(我对WebGL的细节并不那么坚定)glCopyTexImage会插入一个同步点,因此应该不是那里的竞争条件。但是出于性能原因,我还没有glCopyTexImage。相反,我准备第二个FBO并渲染目标,做一个glBlitFrameBuffer,切换到第二个帧缓冲区并继续渲染。这通常会为您提供更好的批处理,也很可能避免您遇到的问题。
当然,你并没有使用纹理作为渲染到帧缓冲区的源,它被选为目标。你呢?