对于简单的纹理复制需求,使用glCopyTexSubImage2D可以实现。不过前段时间碰到一个怪异的现象,glCopyTexSubImage2D()执行耗费了数秒钟才完成,每次如此。折腾了几天也找不着原因。后来换成使用FBO来拷贝就正常。使用FBO还有一个好处就是可以对画面进行拉伸处理。记录如下。
使用glCopyTexSubImage2D函数:
// ...
GLint lastBuffer;
glGetIntegerv(GL_READ_BUFFER, &lastBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glBindTexture(pResource->target, pResource->texture);
glCopyTexSubImage2D(pResource->target, 0, 0, 0, 0, 0, width, height);
glBindTexture(pResource->target, 0);
glReadBuffer(lastBuffer);
// ...
基于FBO和glBlitFramebuffer:
// ...GLuint sourceTex, targetTex;
GLuint rFbo = 0;
GLuint wFbo = 0;
glGenFramebuffers(1, &rFbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, rFbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTex, 0);
glGenFramebuffers(1, &wFbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, wFbo);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTex, 0);
glBlitFramebuffer(0, 0, srcWidth, srcHeight, 0, 0, dstWidth, dstHeight, GL_COLOR_BUFFER_BIT, GL_NEAREST);