注意到WebGL中没有SwapBuffer功能,如果是这样的话,我们如何在绘制调用中更改状态并在WebGL中绘制多个对象,在什么时候由WebGL内部调用swapBuffer?
首先,OpenGL中没有SwapBuffers.SwapBuffers是一个特定于平台的东西,不属于OpenGL.
在任何情况下,虽然WebGL中隐含了SwapBuffers的等价物.如果你调用影响绘图缓冲区的任何WebGL函数(例如,drawArray,drawElements,clear,...),那么下次浏览器合成页面时,它将有效地"交换缓冲区".
请注意,它实际上是"交换"还是"复制"取决于浏览器.例如,如果启用了抗锯齿(默认),那么浏览器将在内部有效地执行"复制",或者更确切地说是"blit",将内部多重采样缓冲区转换为实际可以显示的内容.
另请注意,因为交换是隐式的,所以WebGL会在下一个渲染命令之前清除drawingBuffer.这是为了使行为保持一致,无论浏览器是否决定在内部进行交换或复制.
您可以通过传递{preserveDrawingBuffer: true}给getContext第二个参数强制复制而不是交换(并避免清除),但当然是以不允许交换为代价.
此外,重要的是要意识到交换本身及其发生的时间是半未定义的.换句话说,调用gl.drawXXX或gl.clear将告诉浏览器在下一个复合交换/复制,但在该时间和浏览器实际合成其他事件的时间之间可以得到处理.交换不会发生,直到您当前的事件退出,例如requestAnimationFrame事件,但是,在您的事件退出时间和浏览器合成更多事件的时间之间(例如说mousemove).
重点是,如果不使用{preserveDrawingBuffer: true}你应该总是在一个事件中完成所有的绘图,通常requestAnimationFrame,否则你可能得到不一致的结果.
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |