每帧重新创建 FBO(帧缓冲对象)
Re-create FBO (frame buffer object) each frame
我想创建 FBO,但这在所有上下文之间都是 "shared"。
因为 FBO 是容器,不能是 "shared",而只能是它的缓冲区,所以我想做以下事情:
创建一个对象 FBODescriptor,它是所需 FBO 的描述符,它还包含共享的 opengl 缓冲区。
在每个帧,在任何活动的上下文中,我创建FBO(因此它可用于当前上下文),附加到它缓冲区,并在渲染后删除 FBO 容器。
这样,我就有了一个适用于任何上下文的理想 FBO。
我的假设是因为资源缓冲区是存在的并且不需要每帧重新创建它们而只需要 FBO 容器,所以它没有有意义的惩罚。
可以用吗?
从某种意义上说,它会起作用。但它一点也不好。实际上,您提出的任何导致 "create an OpenGL object every frame" 的解决方案都应立即丢弃。或者至少被认为是高度可疑的。
FBO 经常对其状态进行大量验证。这可不便宜。事实上,建议通常是在完成 FBO 之后根本不要修改它们。不要附加新图像,不要删除它们,任何东西。这显然包括删除和重新创建它们。
如果您想跨上下文传播对帧缓冲区的更改,那么您应该以仅在需要 时才修改或重新创建 FBO 的方式进行。也就是说,当它们真正发生变化时。
我想创建 FBO,但这在所有上下文之间都是 "shared"。 因为 FBO 是容器,不能是 "shared",而只能是它的缓冲区,所以我想做以下事情:
创建一个对象 FBODescriptor,它是所需 FBO 的描述符,它还包含共享的 opengl 缓冲区。
在每个帧,在任何活动的上下文中,我创建FBO(因此它可用于当前上下文),附加到它缓冲区,并在渲染后删除 FBO 容器。
这样,我就有了一个适用于任何上下文的理想 FBO。
我的假设是因为资源缓冲区是存在的并且不需要每帧重新创建它们而只需要 FBO 容器,所以它没有有意义的惩罚。
可以用吗?
从某种意义上说,它会起作用。但它一点也不好。实际上,您提出的任何导致 "create an OpenGL object every frame" 的解决方案都应立即丢弃。或者至少被认为是高度可疑的。
FBO 经常对其状态进行大量验证。这可不便宜。事实上,建议通常是在完成 FBO 之后根本不要修改它们。不要附加新图像,不要删除它们,任何东西。这显然包括删除和重新创建它们。
如果您想跨上下文传播对帧缓冲区的更改,那么您应该以仅在需要 时才修改或重新创建 FBO 的方式进行。也就是说,当它们真正发生变化时。