android - 如何在 Android 的 OpenGL ES 中有效地将一个纹理分配给另一个纹理

标签 android copy textures opengl-es-2.0

我想将纹理 1 复制到纹理 2。背景是我生成15个空的纹理id绑定(bind)到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] 来复制纹理数据吗?

最佳答案

在 ES 2.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 个纹理 ID 的列表视为一个循环缓冲区。

假设您最初创建了纹理 ID:

int[] textures = new int[15];
GLES20.glGenTextures(15, textures, 0);
int newestIdx = 0;

然后每次收到新帧时,将其写入纹理 ID 列表中的下一个条目,在 15 处回绕:

newestIdx = (newestIdx + 1) % 15;
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[newestIdx]);
// Capture new frame into currently bound texture.

然后,每次你想使用第 i 帧时,0 表示最近的帧,1 表示之前的帧,等等,你将它绑定(bind)到:

GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[(newestIdx + i) % 15]);

所以纹理永远不会被复制。您只需跟踪哪个纹理包含哪个帧,并相应地访问它们。

关于android - 如何在 Android 的 OpenGL ES 中有效地将一个纹理分配给另一个纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39941052/

相关文章:

java - 在 EditText 内写入

C++ 将指定的 vector 内容复制到另一个 vector

java - 如何在 Java 中对二维数组进行深拷贝?

OpenGL 2 纹理内部格式 GL_RGB8I、GL_RGB32UI 等

java - LWJGL 使用纹理时颜色困惑 + 经常禁用纹理时 FPS 较低

android - Android 上的 Circle CI 集成与托管在不同 github 存储库上的外部模块

android - 从 web 加载图像时支持多个 android 设备的最佳方法是什么?

Android Intent 操作问题

excel - 将表格数据从网页复制到 Excel 的 VBA 代码

android - Unity Convert Texture to Texture2d 在 android 设备上需要很多时间