【发布时间】:2013-05-29 20:41:50
【问题描述】:
我需要收集有关FBO 的纹理附件中使用的目标的信息,以便将其复制到另一个FBO。
就OpenGL ES 2.0而言,我可以使用glGetFramebufferAttachmentParameter[if]v(),并且由于OpenGL ES 2.0只支持GL_TEXTURE_2D和GL_TEXTURE_CUBE_MAP,返回的信息足以确定使用的纹理目标(当它是不是立方体贴图面,它是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_1D、GL_TEXTURE_2D、GL_TEXTURE_2D_MULTISAMPLE 和 @987654339 @,至少就手册页而言。因此,我如何才能知道纹理附件中使用了这 4 个目标中的哪一个?
复制FBO的需要源于FBOs不在上下文之间共享,实现在主线程中创建屏幕FBOs,我想在专用于每个屏幕的子线程中使用它们以免因渲染循环而停止主线程,从而保持应用程序对 UI 事件的响应。在这种情况下,缓存状态既不受欢迎也不可行;不可取,因为当客户端库(只关心作为应用程序和OpenGL 服务器之间的通信 API)处于缓存状态本身的更好位置时,它会切断应用程序的其他不同关注点,并且不可行,因为在这种情况下,我什至无法控制我的应用程序中的一些问题,如前所述。
现在这是一个理论上的问题,因为我正在处理的实现只支持 OpenGL ES 2.0,但我宁愿编写面向未来的代码,我可以确定用作 FBO 附件的确切纹理目标而不是代码之所以有效,是因为可用选项的数量仅限于我可以通过排除那些不是的选项来确定选择了哪个选项的程度,如上所示,这种方法在功能丰富的桌面上不起作用版本,并且可能不适用于未来的 OpenGL ES 版本。
【问题讨论】: