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