背景:
Android原生相机应用使用OpenGL_1.0上下文来显示相机预览和图库图片。现在我想在原生相机预览上添加一个实时滤镜。
要在我自己的相机应用预览中添加实时滤镜很简单 - 只需使用OpenGL_2.0进行图像处理和显示。由于OpenGL_1.0不支持图像处理,并且它以某种方式用于在Android原生相机应用程序中显示。 *我现在想要创建一个基于OpenGL_2.0的新GL上下文进行图像处理,并将处理后的图像传递给基于OpenGL_1.0的其他GL上下文进行显示。*
问题:
问题是如何将处理后的图像从GL上下文过程(基于OpenGL_2.0)传输到GL上下文显示(基于OpenGL_1.0)。我试图使用FBO:首先在GL上下文处理中从纹理复制图像像素,然后在GL上下文显示中将它们设置回另一个纹理。但是从纹理复制像素非常慢,通常需要几百毫秒。这对于相机预览来说太慢了。
* 有没有更好的方法将纹理从一个GL上下文转移到另一个?特别是,当一个GL上下文基于OpenGL_2.0而另一个基于OpenGL_1.0。*
答案 0 :(得分:7)
我找到了一个使用EGLImage的解决方案。以防有人发现它有用:
加载纹理的线程#1:
EGLContext eglContext1 = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, contextAttributes);
EGLSurface eglSurface1 = eglCreatePbufferSurface(eglDisplay, eglConfig, NULL); // pbuffer surface is enough, we're not going to use it anyway
eglMakeCurrent(eglDisplay, eglSurface1, eglSurface1, eglContext1);
int textureId; // texture to be used on thread #2
// ... OpenGL calls skipped: create and specify texture
//(glGenTextures, glBindTexture, glTexImage2D, etc.)
glBindTexture(GL_TEXTURE_2D, 0);
EGLint imageAttributes[] = {
EGL_GL_TEXTURE_LEVEL_KHR, 0, // mip map level to reference
EGL_IMAGE_PRESERVED_KHR, EGL_FALSE,
EGL_NONE
};
EGLImageKHR eglImage = eglCreateImageKHR(eglDisplay, eglContext1, EGL_GL_TEXTURE_2D_KHR, reinterpret_cast<EGLClientBuffer>(textureId), imageAttributes);
显示3D场景的线程#2:
// it will use eglImage created on thread #1 so make sure it has access to it + proper synchronization etc.
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// texture parameters are not stored in EGLImage so don't forget to specify them (especially when no additional mip map levels will be used)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage);
// texture state is now like if you called glTexImage2D on it
参考: http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis https://groups.google.com/forum/#!topic/android-platform/qZMe9hpWSMU