相当于在GPU内存上运行的glDrawpixels?

时间:2010-03-05 07:20:51

标签: opengl gldrawpixels

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

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

4 个答案:

答案 0 :(得分:4)

让我们覆盖所有基地。

首先,直接回答:是的,有这样的功能。它被称为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)。它不能用于将数据复制到默认的帧缓冲区。

答案 1 :(得分:1)

如果它在纹理中:

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

我在Compositor::_drawPixels

中使用此功能

答案 2 :(得分:0)

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

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)

在调用glDrawPixels之前。

警告:不推荐使用glDrawPixels ......

答案 3 :(得分:0)

使用 glBlitFramebuffer ,它对frambuffer对象(Link)进行操作。这不是已弃用的

您可以利用格式转换扩展多重采样