首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何高效地将texture1复制到texture2?

如何高效地将texture1复制到texture2?
EN

Stack Overflow用户
提问于 2013-04-19 16:21:05
回答 1查看 6.3K关注 0票数 16

我想将texture1复制到texture2。最愚蠢的方式是将tex1数据从图形处理器复制到中央处理器,然后将中央处理器数据复制到图形处理器。愚蠢的代码如下:

代码语言:javascript
复制
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。但不知何故,我认为这仍然是天真的。那么,实现这一点的最有效方法是什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-19 16:55:07

如果您支持OpenGL 4.3,则可以使用直接的glCopyImageSubData来实现此目的:

代码语言:javascript
复制
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位于第一位置的位置)将一种颜色附件填充到另一种颜色附件中:

代码语言:javascript
复制
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副本。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16100308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档