gpt4 book ai didi

opengl - 如何有效地将texture1复制到texture2?

转载 作者:行者123 更新时间:2023-12-03 11:05:26 25 4
gpt4 key购买 nike

我想将texture1复制到texture2。
最笨的方法是把tex1数据从GPU复制到CPU,然后再把CPU数据复制到GPU。
愚蠢的代码如下:

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 的方法。我考虑使用将 tex1 四边形渲染到 tex2 的 FBO。但不知何故,我认为这仍然是幼稚的。那么实现这一点的最有效方法是什么?

最佳答案

如果您支持 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) ,或者如果你有 GL 4 可能更好 glTexStorage2D)。

如果你没有那个,那么使用 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 保持活力可能是个好主意。同样,这也要求目标纹理图像事先具有适当的大小和格式。或者你也可以使用 Michael 的建议,只将源纹理附加到 FBO 并做一个很好的旧 glCopyTex(Sub)Image2D进入目标纹理。需要评估哪个表现更好(如果有的话)。

如果您甚至没有那个,那么您仍然可以使用读取一个纹理并将该数据写入另一个纹理的方法。但不要使用 CPU 内存作为临时缓冲区,而是使用 pixel buffer object (PBO) (自 OpenGL 2.1 以来的核心)。您仍然会有额外的副本,但至少会(或可能是)GPU-GPU 副本。

关于opengl - 如何有效地将texture1复制到texture2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16100308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com