【问题标题】:Blend FBO onto default framebuffer将 FBO 混合到默认帧缓冲区
【发布时间】:2012-01-23 13:17:41
【问题描述】:

澄清一下,当我说“默认帧缓冲区”时,我指的是由窗口系统提供的帧缓冲区,以及最终出现在您的显示器上的帧缓冲区。

为了提高 CAD 应用程序的渲染速度,我设法将 3D 元素与 Qt 处理的 2D 元素分开,现在它们各自渲染到自己的 FBO 中。当需要将它们放到屏幕上时,我将 3D FBO 粘贴到默认 FB 上,然后我想在其上混合我的 2D FBO。

我已经很好地完成了 blitting 部分,但是我看不到如何将我的 2D FBO 融合到它上面?两个 FBO 在大小和格式上都是一样的,并且都和默认的 FB 一样。

我确定这是一个简单的操作,但我在网上找不到任何东西 - 大概我错过了我正在尝试做的事情的正确术语。虽然我使用的是 Qt,但我可以毫无问题地使用本机 OpenGL 命令。

【问题讨论】:

    标签: c++ qt opengl framebuffer


    【解决方案1】:

    blit 操作最终是像素复制操作。如果您想将一张图像叠加在另一张图像之上,则不能对其进行 blit。您必须改为将全屏四边形渲染为纹理并使用 proper blending parameters 进行混合操作。

    【讨论】:

    • 虽然这似乎非常低效,我有两个大小相等的像素值(缓冲区)数组,最终我需要做的就是应用数学运算将其中一个元素合并到另一个的对应元素。 OpenGL 真的只将 FBO 视为纹理吗?
    • @cbamber85 渲染到纹理不会那么低效
    • @cbamber85:“OpenGL 真的只将 FBO 视为纹理吗?” FBO 只是图像的容器。您将图像附加到 FBO,但 FBO 本身并不拥有它们。图像来自其他对象:纹理和渲染缓冲区。无论看起来多么“低效”,将一张图像渲染到另一张图像上的速度非常快。没有顶点变换。无非就是片段着色器中的纹理采样。此外,API 并没有为您提供其他方法,因此它的效率非常高。
    • 好吧,如果这是这样做的方式,我无法争辩。
    • @cbamber85:带纹理的四边形比 blit 快得多。此外,如果可以选择使用着色器,您可以一次性完成 blit-and-blend-over。这将再次快得多(一次通过且无需混合,即需要读取-修改-写入)。
    【解决方案2】:

    您可以使用GL_EXT_framebuffer_blit 将帧缓冲区对象的内容blit 到应用程序帧缓冲区(或任何其他)。尽管如规范所述,无法使用混合:

    像素副本绕过片段管道。唯一的片段 影响 blit 的操作是像素所有权测试和 剪刀测试。

    因此,任何混合都意味着按照建议使用片段着色器。一张带混合的全屏通行证应该很便宜,我相信没什么好担心的。

    【讨论】:

      【解决方案3】:

      使用着色器从帧缓冲区读回。这是 OpenGL ES 扩展,并非所有硬件都支持。

      https://www.khronos.org/registry/gles/extensions/EXT/EXT_shader_framebuffer_fetch.txt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多