WebGL中的swapBuffer OpenGL调用在哪里

sea*_*rse 5 webgl

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

gma*_*man 8

首先,OpenGL中没有SwapBuffers.SwapBuffers是一个特定于平台的东西,不属于OpenGL.

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

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

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

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

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

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