OpenGL:复制帧缓冲区对象

Posted

技术标签:

【中文标题】OpenGL:复制帧缓冲区对象【英文标题】:OpenGL: Copying a Frame Buffer Object 【发布时间】:2013-05-29 20:41:50 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我想出了一个简洁的抽象方法:因为我需要为几个效果合成,而合成对 CPU 来说基本上是无重量的,我可以在屏幕 FBO 的主线程中执行该步骤,从而避免需要复制它们;那么所有的摄像机都将渲染到他们可以绝对控制的屏幕外 FBO。

以上是关于OpenGL:复制帧缓冲区对象的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]

Android OpenGL ES 2.0 重用前一帧

快速交换帧缓冲区 OpenGL

将OpenGL帧缓冲区对象与Qt(QOpenGLWidget)一起使用,绘制到帧缓冲区时如何禁用多重采样

OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

OpenGL中的单色渲染到帧缓冲区对象?