gpt4 book ai didi

webgl - WebGL 中的 swapBuffer OpenGL 调用在哪里

转载 作者:行者123 更新时间:2023-12-04 17:32:08 32 4
gpt4 key购买 nike

注意到 WebGL 中不存在 SwapBuffer 功能,如果是这种情况,我们如何在绘制调用中更改状态并在 WebGL 中绘制多个对象,WebGL 在什么时间点在内部调用 swapBuffer?

最佳答案

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

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

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

另请注意,由于交换是隐式的,WebGL 将在下一个渲染命令之前清除绘图缓冲区。这是为了使行为一致,无论浏览器是否决定在内部交换或复制。

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

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

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

关于webgl - WebGL 中的 swapBuffer OpenGL 调用在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41018445/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com