glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const ovid *pixels);
是否有这样的功能,除了访问CPU内存,它访问GPU内存? [帧缓冲对象的纹理]
答案 0 :(得分:4)
让我们覆盖所有基地。
首先,直接回答:是的,有这样的功能。它被称为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)。它不能用于将数据复制到默认的帧缓冲区。
答案 1 :(得分:1)
答案 2 :(得分:0)
glDrawPixels可以从缓冲区对象中读取。做一个
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, XXX)
在调用glDrawPixels之前。
警告:不推荐使用glDrawPixels ......
答案 3 :(得分:0)
使用 glBlitFramebuffer ,它对frambuffer对象(Link)进行操作。这不是已弃用的。
您可以利用格式转换,扩展和多重采样。