OpenGL:复制帧缓冲对象

时间:2013-05-29 20:41:51

标签: opengl opengl-es

我需要收集有关FBO的纹理附件中使用的目标的信息,以便将其复制到另一个FBO

OpenGL ES 2.0而言,我可以使用glGetFramebufferAttachmentParameter[if]v(),由于OpenGL ES 2.0仅支持GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP,因此返回的信息足以支持GL_TEXTURE_2D确定使用的纹理目标(当它不是立方体贴图面时,它是GL_TEXTURE_1D,因为它不能是其他任何东西)。

然而,在桌面上,事情发生了变化:

因为我们有GL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_RECTANGLEGL_TEXTURE_3DFBO's和6个立方体贴图面作为{{的有效目标1}}纹理附件,虽然6个立方体贴图面和GL_TEXTURE_3D目标很容易辨别(因为对立方体贴图面和分层纹理有特定的查询),但同样不适用于其余目标:{ {1}},GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLE,至少就手册页而言。因此,我如何能够分辨出纹理附件中使用了哪4个目标?

复制GL_TEXTURE_RECTANGLE的需要源于上下文之间不共享FBO的事实,实现在主线程中创建了屏幕FBOs,我想在它们中使用它们专用于每个屏幕的子线程,以便不使用渲染循环停止主线程,从而使应用程序响应UI事件。在这种情况下,缓存状态既不可取也不可行;当客户端库(仅关注用作应用程序和FBOs服务器之间的通信API)处于更好的缓存状态本身时,它会切断应用程序的其他不同关注点,并且这是不可行的,因为在这种情况下,我甚至没有控制我申请中的一些问题,如前所述。

现在这是一个理论问题,因为我正在开发的实现仅支持OpenGL ES 2.0,但我宁愿编写面向未来的代码,我可以确定用作FBO附件的确切纹理目标。代码只是因为可用选项的数量限制在我可以通过排除那些不选择的选项来确定选择哪个选项的点,如上所示,这种方法在功能丰富的桌面上不起作用版本,可能不适用于未来的OpenGL ES版本。

1 个答案:

答案 0 :(得分:2)

OpenGL无法解决您遇到的问题。没有办法查看纹理对象并知道它是什么目标,也没有办法知道附加到FBO的纹理的textarget参数是什么。一般来说,您需要跟踪纹理对象的目标,就像您希望跟踪纹理对象的名称GLuint从{{1}回来一样}})。

处理此问题的最佳方法是简单地询问客户端库它添加到FBO的纹理和纹理目标。如果您无法让此客户端库为您提供此信息,那么您将无法执行您需要执行的操作。