我目前正在使用 Android NDK 和 OpenGL ES 2.0 在 Samsung Galaxy SII (ARM Mali-400 MP) 上进行一些 GPGPU 开发。为此,我需要从已通过 FBO 渲染的纹理生成 mipmap。不幸的是,glGenerateMipmap() 在设备上似乎非常慢。为 512x512 RGBA8888 纹理生成 mipmap 大约需要 90 毫秒。由于我也在其他 Android 设备上尝试了相同的代码,该函数的运行速度要快得多(大约 2 毫秒),这种速度下降确实让我感到困惑。我在这里做错了什么或者遗漏了什么吗?任何人都可以提供在具有 ARM Mali GPU 的设备上运行的此案例的示例代码吗?
这是我的代码的相关部分:
glGenTextures(1, &texId);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texId);
// Allocate graphics memory.
glTexImage2D(GL_TEXTURE_2D, 0, format, cols, rows, 0, format, type, NULL);
// Allocate memory for mipmap.
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Create off-screen framebuffer object and attach the texture to it.
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_FRAMEBUFFER, fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);
// Now render to that texture
...
// Generate MIP map.
glBindTexture(GL_TEXTURE_2D, texId);
glGenerateMipmap(GL_TEXTURE_2D);