我想把texture1复制到texture2。背景是我生成15个空纹理id并将它们绑定到GLES11Ext.GL_TEXTURE_EXTERNAL_OES,下面是我的代码:
int[] textures = new int[15];
GLES20.glGenTextures(15, textures, 0);
GlUtil.checkGlError("glGenTextures");
for(int i=0;i<15;i++)
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[i]);然后,我总是将相机预览转到textures[0],我希望将纹理从textures[0]复制到textures[1],以保持时间戳1的帧内容,并将纹理从textures[0]复制到textures[2],以保持时间戳2的帧内容。它看起来像是在GPU中缓冲一些纹理数据,并在将来呈现其中的一些数据。所以我想知道有什么事要做吗?我可以用textures[2]=textures[0]复制纹理数据吗?
发布于 2016-10-09 16:43:08
在ES2.0中没有一种非常直接的复制纹理数据的方法。最简单的方法可能是使用glCopyTexImage2D()。要使用这一点,您必须创建一个FBO,并附加源纹理到它。假设srcTexId是源纹理的id,dstTexId是目标纹理的id:
GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexId, 0);
glBindTexture(GL_TEXTURE_2D, dstTexId);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);尽管如此,根据你的描述,我不认为这是你真正应该做的,原因如下:
听起来你想保留最新的15张相机图片。要做到这一点,您可以简单地跟踪15个纹理中的哪个包含最近的图像,并将15个纹理ids的列表作为一个循环缓冲区。
假设您最初创建了纹理ids:
int[] textures = new int[15];
GLES20.glGenTextures(15, textures, 0);
int newestIdx = 0;然后,每次收到新帧时,都将其写入纹理it列表中的下一个条目,并在15左右进行包装:
newestIdx = (newestIdx + 1) % 15;
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[newestIdx]);
// Capture new frame into currently bound texture.然后,每次您想要使用ith框架(0引用最近的框架,1引用之前的框架,等等)时,都需要将其绑定到:
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[(newestIdx + i) % 15]);所以纹理永远不会被复制。您只需跟踪哪个纹理包含哪个框架,并相应地访问它们。
https://stackoverflow.com/questions/39941052
复制相似问题