OpenGL:仅使用一个帧缓冲区并切换目标纹理

OpenGL:仅使用一个帧缓冲区并切换目标纹理,opengl,framebuffer,fbo,Opengl,Framebuffer,Fbo,不使用多个帧缓冲区对象,我是否可以只创建一个,并在需要时通过切换其目标纹理来实现相同的结果 这在所有情况下都是个坏主意吗?若有,原因为何 我在程序的API中实现了一个函数render.SetTargetTexture(),从逻辑上讲,如果在后台使用更多的帧缓冲区,它将无法工作。那么我必须完全公开帧缓冲区。FBO本身只是一些逻辑结构,由实现维护,它只会消耗其参数所需的少量内存。FBO的主要目的是使对象保持一致的状态 无论何时更改FBO的结构,实现都必须检查其有效性和完整性。OpenGL规范没有

不使用多个帧缓冲区对象,我是否可以只创建一个,并在需要时通过切换其目标纹理来实现相同的结果

  • 这在所有情况下都是个坏主意吗?若有,原因为何

我在程序的API中实现了一个函数
render.SetTargetTexture()
,从逻辑上讲,如果在后台使用更多的帧缓冲区,它将无法工作。那么我必须完全公开帧缓冲区。

FBO本身只是一些逻辑结构,由实现维护,它只会消耗其参数所需的少量内存。FBO的主要目的是使对象保持一致的状态

无论何时更改FBO的结构,实现都必须检查其有效性和完整性。OpenGL规范没有说明此操作的复杂性,但可以安全地假设,对FBO结构的更改是最耗时的操作(可能是大幅度更改)


由于FBO本身不消耗值得注意的内存,因此只有附件占用内存,这是独立的对象,分配多个FBO并进行切换,这是我的建议。

FBO本身只是一些逻辑结构,由实现维护,它将只消耗其参数所需的少量内存。FBO的主要目的是使对象保持一致的状态

无论何时更改FBO的结构,实现都必须检查其有效性和完整性。OpenGL规范没有说明此操作的复杂性,但可以安全地假设,对FBO结构的更改是最耗时的操作(可能是大幅度更改)


由于FBO本身不消耗值得注意的内存,因此只有附件占用内存,这是独立的对象,分配多个FBO并切换这些是我的建议。

由于人们给出的原因,切换帧缓冲区通常更快。根据我的经验,将不同的纹理类型附加到fbo时也存在问题(2D纹理附加到fbo,之前附加了1D纹理,因此附加到fbo的第一个纹理设置了某种目标状态,以后无法更改)。我使用的解决方案是为每种目标类型设置一个fbo。此错误发生在NVidia Quadro设备上,不确定是否是驱动程序问题。

由于人们给出的原因,切换帧缓冲区通常更快。根据我的经验,将不同的纹理类型附加到fbo时也存在问题(2D纹理附加到fbo,之前附加了1D纹理,因此附加到fbo的第一个纹理设置了某种目标状态,以后无法更改)。我使用的解决方案是为每种目标类型设置一个fbo。此错误发生在NVidia Quadro设备上,不确定这是否是驱动程序问题。

我从未对此进行过实际基准测试,但似乎可以得出结论,绑定不同的FBO更有效。将不同的纹理绑定到FBO需要对帧缓冲区完整性进行复杂的一致性检查(如果不是由您明确检查,则在任何情况下都需要在驱动程序内部检查)。绑定一个不同的、未修改的帧缓冲区并不需要这样的东西。我认为从另一个角度来看,它可能并不重要。我不知道有哪款应用每帧切换目标数千次。大多数切换都是最大值的几倍。我同意切换FBO应该比切换附件更快,但如果这并不重要,那么API也可以。我从未实际测试过这一点,但似乎可以得出结论,绑定不同的FBO更有效。将不同的纹理绑定到FBO需要对帧缓冲区完整性进行复杂的一致性检查(如果不是由您明确检查,则在任何情况下都需要在驱动程序内部检查)。绑定一个不同的、未修改的帧缓冲区并不需要这样的东西。我认为从另一个角度来看,它可能并不重要。我不知道有哪款应用每帧切换目标数千次。大多数切换速度是最大值的几倍。我同意切换FBO应该比切换附件快,但如果这并不重要,那么您的API也可以。