【问题标题】:Equiv of glDrawpixels that operates on GPU memory?相当于在 GPU 内存上运行的 glDrawpixels?
【发布时间】:2010-03-05 07:20:51
【问题描述】:
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);

有没有这样的功能,除了访问CPU内存,它访问GPU内存? [帧缓冲对象的纹理]

【问题讨论】:

  • 设置纹理并绘制矩形?

标签: opengl gldrawpixels


【解决方案1】:

让我们在这里涵盖所有基础。

首先,直接回答:是的,有这样的功能。它被称为glDrawPixels。我不是在开玩笑。

glDrawPixels 当然可以从 GPU 内存中读取,前提是you are using buffer objects as their source data(通常称为“像素缓冲区对象”)。 glDrawPixels 可以使用像素缓冲区对象作为像素数据的来源。缓冲区对象(理论上,至少)在 GPU 内存中,因此它们符合条件。

但是,您添加到此“帧缓冲区对象的纹理”。在此条件下,您会问,“有没有办法将像素数据从一个纹理/帧缓冲区复制到当前帧缓冲区?”

是的。 glBlitFramebuffer 可以做到这一点。它从GL_READ_FRAMEBUFFERGL_DRAW_FRAMEBUFFER。而且由于您可以将纹理中的图像添加到 FBO,因此您可以很好地从图像中复制。您甚至可以从默认帧缓冲区复制到某个渲染缓冲区或纹理。

您还可以使用glCopyImageSubData,它将像素矩形从一个图像复制到另一个图像。如果您所做的只是复制像素数据,这比glBlitFramebuffer 方便得多。目前这是相当新的(GL 4.3,或ARB_copy_image)。它不能用于将数据复制到默认帧缓冲区。

【讨论】:

    【解决方案2】:

    如果它在纹理中:

    • 设置正交平截头体
    • 禁用混合、深度测试等。
    • 绑定纹理
    • 使用正确的纹理坐标绘制屏幕对齐的纹理四边形

    我在例如Compositor::_drawPixels中使用它

    【讨论】:

      【解决方案3】:

      glDrawPixels 可以从缓冲区对象中读取。做一个

      glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)
      

      在调用 glDrawPixels 之前。

      警告:glDrawPixels 已弃用...

      【讨论】:

      • @Bahbar 什么是未弃用的解决方案?
      【解决方案4】:

      使用 glBlitFramebuffer,它对帧缓冲区对象 (Link) 进行操作。 Ans 这不是弃用

      您可以利用格式转换缩放多重采样

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 2023-03-07
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 2011-12-11
        • 2021-08-06
        相关资源
        最近更新 更多