WebGL中的swapBuffer OpenGL调用在哪里?

9

注意到WebGL中没有SwapBuffer功能,那么我们如何在WebGL中跨绘制调用改变状态并绘制多个对象?WebGL在何时内部调用SwapBuffer?

2个回答

13
首先,在OpenGL中没有SwapBuffers。SwapBuffers是特定于平台的东西,不是OpenGL的一部分
无论如何,WebGL中隐含了SwapBuffers的等价物。如果调用任何影响绘图缓冲区的WebGL函数(例如,drawArray、drawElements、clear等),则下次浏览器合成页面时它将有效地"swapbuffers"。
请注意,它实际上是“交换”还是“复制”取决于浏览器。例如,如果启用了抗锯齿(默认设置),则在内部浏览器将有效地执行一个“复制”,或者更确切地说是一个“blit”,将内部多样本缓冲区转换为实际可显示的内容。
另请注意,由于交换是隐式的,WebGL会在下一个渲染命令之前清除绘图缓冲区。这是为了使行为一致,无论浏览器决定在内部进行交换还是复制。
您可以通过将{preserveDrawingBuffer: true}作为第二个参数传递给getContext来强制执行复制而不是交换(并避免清除),但当然代价是禁止交换。

同样重要的是要意识到交换本身以及何时发生是半未定义的。换句话说,调用 gl.drawXXXgl.clear 会告诉浏览器在下一次合成时进行交换/复制,但在此期间,浏览器实际合成其他事件之前,可能会处理其他事件。交换不会发生直到当前事件退出,例如一个requestAnimationFrame事件, 但是,在您的事件退出和浏览器合成更多事件之间,可能会发生其他事件(例如mousemove)。

所有这些的重点是,如果不使用 {preserveDrawingBuffer: true},则通常应在一个事件中完成所有绘图操作,通常是requestAnimationFrame,否则可能会得到不一致的结果。


1
据我所知,swap buffers 调用通常不会改变任何 可见的 GL 状态。然而,在绘制调用之间有很多 GL 调用可以改变该状态。至于缓冲区交换,浏览器会在具有渲染代码的回调返回后的某个时间为您执行此操作(是的,没有直接控制何时实际发生)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接