【发布时间】:2010-03-05 07:20:51
【问题描述】:
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);
有没有这样的功能,除了访问CPU内存,它访问GPU内存? [帧缓冲对象的纹理]
【问题讨论】:
-
设置纹理并绘制矩形?
标签: opengl gldrawpixels
glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);
有没有这样的功能,除了访问CPU内存,它访问GPU内存? [帧缓冲对象的纹理]
【问题讨论】:
标签: opengl gldrawpixels
让我们在这里涵盖所有基础。
首先,直接回答:是的,有这样的功能。它被称为glDrawPixels。我不是在开玩笑。
glDrawPixels 当然可以从 GPU 内存中读取,前提是you are using buffer objects as their source data(通常称为“像素缓冲区对象”)。 glDrawPixels 可以使用像素缓冲区对象作为像素数据的来源。缓冲区对象(理论上,至少)在 GPU 内存中,因此它们符合条件。
但是,您添加到此“帧缓冲区对象的纹理”。在此条件下,您会问,“有没有办法将像素数据从一个纹理/帧缓冲区复制到当前帧缓冲区?”
是的。 glBlitFramebuffer 可以做到这一点。它从GL_READ_FRAMEBUFFER 到GL_DRAW_FRAMEBUFFER。而且由于您可以将纹理中的图像添加到 FBO,因此您可以很好地从图像中复制。您甚至可以从默认帧缓冲区复制到某个渲染缓冲区或纹理。
您还可以使用glCopyImageSubData,它将像素矩形从一个图像复制到另一个图像。如果您所做的只是复制像素数据,这比glBlitFramebuffer 方便得多。目前这是相当新的(GL 4.3,或ARB_copy_image)。它不能用于将数据复制到默认帧缓冲区。
【讨论】:
【讨论】:
glDrawPixels 可以从缓冲区对象中读取。做一个
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)
在调用 glDrawPixels 之前。
警告:glDrawPixels 已弃用...
【讨论】:
使用 glBlitFramebuffer,它对帧缓冲区对象 (Link) 进行操作。 Ans 这不是弃用。
您可以利用格式转换、缩放和多重采样。
【讨论】: