【问题标题】:Texture buffer object as framebuffer storage纹理缓冲对象作为帧缓冲存储
【发布时间】:2011-09-21 01:34:20
【问题描述】:

有什么方法可以将纹理缓冲对象(ARB_texture_buffer_object)附加到帧缓冲(EXT_framebuffer_object),这样我就可以直接渲染到纹理缓冲对象中了吗?

我需要它来制作多采样帧缓冲区(颜色缓冲区、深度缓冲区和模板缓冲区)的精确按位副本,并将此副本驻留在主内存中而不是 VRAM 中。

更新: 问题是我不能直接在多采样帧缓冲区上调用 glReadPixels 来复制其内容。相反,我必须将多采样帧缓冲区传输到中间帧缓冲区,然后在其上调用 glReadPixels。在此过程中,多个样本被平均并写入中间缓冲区。如果我用 glWritePixels 恢复这个缓冲区,现在当然会损失精度。

我意识到我可以使用多样本纹理作为帧缓冲区对象的后备存储,但此纹理将驻留在 VRAM 中,并且似乎无法将其复制到主内存而不会损失同样的精度。具体来说,我担心与多采样深度缓冲区附件相关的精度损失,而不是颜色缓冲区。

是否有另一种方法可以在 OpenGL 中制作多采样帧缓冲区的精确副本(并恢复该副本)?

TL;DR:如何将多样本帧缓冲区(特别是深度缓冲区)的确切内容复制到主内存并稍后恢复这些内容,而不会损失精度。

【问题讨论】:

    标签: opengl opengl-3


    【解决方案1】:

    OpenGL 不允许您将缓冲区纹理绑定为渲染目标。但是,我看不出是什么阻止了您制作“多样本帧缓冲区的精确按位副本”。您遇到过哪些您认为缓冲纹理可以解决的问题?


    如何将多样本帧缓冲区(特别是深度缓冲区)的确切内容复制到主内存,然后在不损失精度的情况下恢复这些内容。

    没有。

    而且您不需要将图像的内容复制到主内存以便以后保存和恢复它。如果您需要保留多样本图像的内容,只需将其传送到另一个多样本图像即可。您可以将其回位以恢复它。或者更好的是,渲染到在完成之前不会擦除的多重采样纹理。这样,就不需要任何复制了。

    【讨论】:

    • 如果无法在纹理上进行渲染,您知道portals 在Crystal Space 中是如何实现的吗? crystalspace3d.org/docs/online/1.4/manual/Portal-Engine.html(我不知道它是否是所有图形引擎的共同特征)。谢谢
    • Simon,您当然可以渲染到纹理对象。不过,我的问题是针对纹理缓冲区对象(请参阅 ARB_texture_buffer_object)。
    • @Simon:关于您关于门户的问题:您不必为此使用纹理渲染。在基于 BSP 的引擎中(AFAIK Crystal Space 属于该类别),可以使用模板缓冲区“切出”门户的开口,然后清除深度缓冲区并开始渲染门户的远端,从 BSP 开始远端门户连接到的节点。 Quake3 引擎实现了这一点;它是开源的,所以你可以检查它的代码以了解它是如何完成的。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多