注意到WebGL中没有SwapBuffer功能,那么我们如何在WebGL中跨绘制调用改变状态并绘制多个对象?WebGL在何时内部调用SwapBuffer?
注意到WebGL中没有SwapBuffer功能,那么我们如何在WebGL中跨绘制调用改变状态并绘制多个对象?WebGL在何时内部调用SwapBuffer?
{preserveDrawingBuffer: true}
作为第二个参数传递给getContext
来强制执行复制而不是交换(并避免清除),但当然代价是禁止交换。
同样重要的是要意识到交换本身以及何时发生是半未定义的。换句话说,调用 gl.drawXXX
或 gl.clear
会告诉浏览器在下一次合成时进行交换/复制,但在此期间,浏览器实际合成其他事件之前,可能会处理其他事件。交换不会发生直到当前事件退出,例如一个requestAnimationFrame
事件, 但是,在您的事件退出和浏览器合成更多事件之间,可能会发生其他事件(例如mousemove
)。
所有这些的重点是,如果不使用 {preserveDrawingBuffer: true}
,则通常应在一个事件中完成所有绘图操作,通常是requestAnimationFrame
,否则可能会得到不一致的结果。
swap buffers
调用通常不会改变任何 可见的 GL 状态。然而,在绘制调用之间有很多 GL 调用可以改变该状态。至于缓冲区交换,浏览器会在具有渲染代码的回调返回后的某个时间为您执行此操作(是的,没有直接控制何时实际发生)。