【发布时间】:2015-07-11 16:07:35
【问题描述】:
我正在使用 GLSurfaceView 活动在 Android 设备上显示相机框架。由于我是OpenGl Es 的新手,我想知道如何获取图像缓冲区并对其进行修改,然后在手机上显示修改后的帧?
在实现 GLSurfaceView.Renderer 的 Renderer 类中,我调用了本机函数:
public class Renderer implements GLSurfaceView.Renderer {
public void onDrawFrame(GL10 gl) {
MyJNINative.render();
}
...
}
我正在使用的API 提供了一个connectCallBack 方法,可以通过onFrameAvailableNow 之类的方式访问图像缓冲区。
所以我已经有了const 类型的图像缓冲区。所以我对它的修改不会得到反映。
现在我的问题是如何添加一些gl方法来修改可以反映在显示器上的图像缓冲区?
我的原生渲染器:
Java_com_project_MyJNINative_render(
JNIEnv*, jobject) {
// Let's say I have image buffer here called "uint_8t* buffer"
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glViewport(0, 0, width, height);
// UpdateTexture()
api_handler.UpdateTexture());
gl_vid_obj->Render(glm::mat4(1.0f), glm::mat4(1.0f));
/// I NEED SOME CODE HERE TO set gl buffer
}
【问题讨论】:
-
相机输出发送到哪里?您一次只能将一个生产者附加到 Surface,因此您可以将相机输出发送到那里,也可以发送 GLES 渲染。您是否在 SurfaceTexture 上接收相机输出?你打算做什么样的修改?
-
@fadden 渲染相机输出以显示。是的,我正在
gl表面纹理上接收相机输出。我需要更改当前帧中的一些随机像素。 -
相机图像处于“外部”纹理中。你可以用它做大多数其他 GLES 纹理的事情。从 C++ 或 Java 编辑纹理并不简单。渲染纹理然后在其上绘制要容易得多。我仍然不知道您要做什么,但是如果您想要比绘制更复杂的东西,也许过滤就是您想要的?此处示例:youtube.com/watch?v=kH9kCP2T5Gg
-
@fadden 是的,过滤和图像处理的东西正是我需要的。通过查看
yTube链接中的代码,我得出结论,这并不是那么简单。但是,我想知道这可能会更容易,因为我已经捕获了原始帧缓冲区。我还需要的是更新GLSurfaceView -
Grafika 演示是使用 GLES 片段着色器应用卷积过滤器的一个相当简单的示例。如果您想在 GPU 上完成工作,您可以做类似的事情,或者将相机输出提供给 Renderscript 并以这种方式完成工作 (developer.android.com/guide/topics/renderscript/compute.html)。您无法通过 FBO 访问相机帧,因为它是“外部”纹理。
标签: android opengl-es android-camera glsurfaceview