WebGL中的swapBuffer OpenGL调用在哪里

时间:2016-12-07 13:12:27

标签: webgl

注意到WebGL中没有SwapBuffer功能,如果是这样的话,我们如何在绘制调用中更改状态并在WebGL中绘制多个对象,在什么时候由WebGL在内部调用swapBuffer?

2 个答案:

答案 0 :(得分:5)

首先,OpenGL中没有SwapBuffers。 SwapBuffers is a platform specific thing that is not part of OpenGL

在任何情况下,虽然WebGL中隐含了SwapBuffers的等价物。如果你调用影响绘图缓冲区的任何WebGL函数(例如,drawArray,drawElements,clear,...),那么下次浏览器合成页面时,它将有效地“交换缓冲区”。

请注意,它实际上是“交换”还是“复制”取决于浏览器。例如,如果启用了抗锯齿(默认),那么浏览器将在内部有效地执行“复制”或“blit”,将内部多重采样缓冲区转换为实际可以显示的内容。

另请注意,因为交换是隐式的,所以WebGL会在下一个渲染命令之前清除drawingBuffer。这是为了使行为保持一致,无论浏览器是否决定在内部进行交换或复制。

您可以通过将{preserveDrawingBuffer: true}传递给getContext作为第二个参数来强制复制而不是交换(并避免清算),但当然是以不允许交换为代价的。

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

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

答案 1 :(得分:1)

AFAIK,swap buffers来电通常不会更改任何可见 GL状态。虽然有很多GL调用来改变绘制调用之间的状态。至于缓冲区交换,浏览器会在返回渲染代码之后的某个时间为你做这件事(是的,没有直接控制何时会发生这种情况)。