GLFW 回调和 OpenGL 循环
GLFW callbacks and OpenGL round robin
在循环方式中,您通常有几个缓冲区,并且在这些缓冲区之间循环,在这种情况下如何管理 GLFW 回调?
假设您有 3 个缓冲区,您在第一个缓冲区中发送具有指定视口的绘制命令,但是当 cpu 处理第二个缓冲区时,它会收到 [=18= 的回调] resize 例如,服务器 可能 渲染你用之前的视口大小发送的任何内容,导致一些 "artifacts",这只是一个例子,但它会发生真的一切都对吗?一个简单的解决方法是在渲染最后一个缓冲区之后处理回调(最后收到的回调),并阻止客户端直到服务器处理完所有命令,这是正确的(这意味着每个缓冲区的帧延迟)?还有什么可以做的吗?
OpenGL 的内部状态机负责所有这些工作。所有 OpenGL 命令都在命令队列中排队并按顺序执行。对 glViewport
的调用——以及与此相关的任何其他 OpenGL 命令——只会影响其后命令的结果,而不会影响之前的命令。
无需实现自定义循环缓冲。
这甚至涵盖了诸如纹理和缓冲区对象之类的内容(除了持久映射的缓冲区对象之外)。 IE。如果您执行以下操作顺序
glDrawElements(…); // (1)
glTexSubImage2D(GL_TEXTURE_2D, …);
glDrawElements(…); // (2)
OpenGL 渲染模型 要求 glDrawElements
(1) 使用绑定纹理对象的纹理数据,就像调用 glTexSubImage2D
之前一样and glDrawElements
(2) 必须使用在 (1) 和 (2) 之间上传的数据。
是的,这涉及跟踪内容、隐式数据副本和许多其他不愉快的事情。是的,这也可能意味着您走的路很慢。
在循环方式中,您通常有几个缓冲区,并且在这些缓冲区之间循环,在这种情况下如何管理 GLFW 回调?
假设您有 3 个缓冲区,您在第一个缓冲区中发送具有指定视口的绘制命令,但是当 cpu 处理第二个缓冲区时,它会收到 [=18= 的回调] resize 例如,服务器 可能 渲染你用之前的视口大小发送的任何内容,导致一些 "artifacts",这只是一个例子,但它会发生真的一切都对吗?一个简单的解决方法是在渲染最后一个缓冲区之后处理回调(最后收到的回调),并阻止客户端直到服务器处理完所有命令,这是正确的(这意味着每个缓冲区的帧延迟)?还有什么可以做的吗?
OpenGL 的内部状态机负责所有这些工作。所有 OpenGL 命令都在命令队列中排队并按顺序执行。对 glViewport
的调用——以及与此相关的任何其他 OpenGL 命令——只会影响其后命令的结果,而不会影响之前的命令。
无需实现自定义循环缓冲。
这甚至涵盖了诸如纹理和缓冲区对象之类的内容(除了持久映射的缓冲区对象之外)。 IE。如果您执行以下操作顺序
glDrawElements(…); // (1)
glTexSubImage2D(GL_TEXTURE_2D, …);
glDrawElements(…); // (2)
OpenGL 渲染模型 要求 glDrawElements
(1) 使用绑定纹理对象的纹理数据,就像调用 glTexSubImage2D
之前一样and glDrawElements
(2) 必须使用在 (1) 和 (2) 之间上传的数据。
是的,这涉及跟踪内容、隐式数据副本和许多其他不愉快的事情。是的,这也可能意味着您走的路很慢。