我想将texture1复制到texture2。最愚蠢的方式是将tex1数据从图形处理器复制到中央处理器,然后将中央处理器数据复制到图形处理器。愚蠢的代码如下:
float *data = new float[width*height*4];
glBindTexture(GL_TEXTURE_2D, tex1);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, data);
glBindTexture(GL_TEXTURE_2D, tex2]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, data);据我所知,它必须存在一种方法,支持从GPU tex到GPU tex的数据复制,而不涉及CPU。我考虑使用FBO来渲染一个tex1四边形到tex2。但不知何故,我认为这仍然是天真的。那么,实现这一点的最有效方法是什么呢?
发布于 2013-04-19 16:55:07
如果您支持OpenGL 4.3,则可以使用直接的glCopyImageSubData来实现此目的:
glCopyImageSubData(tex1, GL_TEXTURE_2D, 0, 0, 0, 0,
tex2, GL_TEXTURE_2D, 0, 0, 0, 0,
width, height, 1);当然,这要求目标纹理已经分配了一个适当大小和格式的图像(使用简单的glTexImage2D(..., nullptr),或者更好的glTexStorage2D,如果你有GL 4的话)。
如果没有,那么使用FBO将一个纹理渲染到另一个纹理中可能仍然是最好的方法。最后,你甚至不需要渲染源纹理。您只需将这两个纹理附加到FBO,并使用glBlitFramebuffer (从OpenGL 3开始的核心,或使用2.x中的GL_EXT_framebuffer_blit扩展,几乎任何FBO位于第一位置的位置)将一种颜色附件填充到另一种颜色附件中:
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, tex1, 0);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
GL_TEXTURE_2D, tex2, 0);
glDrawBuffer(GL_COLOR_ATTACHMENT1);
glBlitFramebuffer(0, 0, width, height, 0, 0, width, height,
GL_COLOR_BUFFER_BIT, GL_NEAREST);当然,如果您这样做了多次,这可能是一个好主意,让这个FBO活着。同样,这也要求目标纹理图像预先具有适当的大小和格式。或者你也可以使用迈克尔的建议,只将源纹理附加到FBO,并在目标纹理中执行一个很好的旧glCopyTex(Sub)Image2D。需要评估哪个性能更好(如果有)。
如果你甚至没有那个,那么你仍然可以使用你的方法来读取一个纹理,并将该数据写入另一个纹理。但不是使用CPU内存作为临时缓冲区,而是使用pixel buffer object (PBO) (从OpenGL 2.1开始的核心)。您仍然会有一个额外的副本,但至少这将(或很可能是) GPU-GPU副本。
https://stackoverflow.com/questions/16100308
复制相似问题