2
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);

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

4

4 回答 4

4

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

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

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

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

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

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

于 2012-08-26T11:25:02.473 回答
1

如果它在纹理中:

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

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

于 2010-03-05T08:22:02.900 回答
0

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

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

于 2010-03-05T21:46:03.313 回答
0

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

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)

在调用 glDrawPixels 之前。

警告:glDrawPixels 已弃用...

于 2010-03-05T14:29:34.057 回答