0

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

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

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

因为我们有GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_RECTANGLE,GL_TEXTURE_3D和 6 个立方体贴图面作为FBO's纹理附件的有效目标,而 6 个立方体贴图面和GL_TEXTURE_3D目标很容易分辨(因为有针对立方体贴图面和分层纹理的特定查询) ,这同样不适用于其余目标:GL_TEXTURE_1DGL_TEXTURE_2DGL_TEXTURE_2D_MULTISAMPLEGL_TEXTURE_RECTANGLE,至少就手册页而言。因此,我如何才能知道纹理附件中使用了这 4 个目标中的哪一个?

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

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

4

1 回答 1

2

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

处理这个问题的最好方法是简单地询问客户端库它添加到它的 FBO 中的纹理和纹理目标。如果你不能让这个客户端库为你提供这些信息,那么你就不能做你需要做的事情。

于 2013-05-29T21:03:18.657 回答