通过 GLSurfaceView 修改和更新相机框架
Modify and update camera frame via GLSurfaceView
我正在使用 GLSurfaceView
activity 在 android 设备上显示相机框架。由于我是 OpenGl Es
的新手,我想知道如何获取图像缓冲区并对其进行修改,然后在 phone 上显示修改后的帧?
在实现 GLSurfaceView.Renderer
的渲染器 class 中,我调用了一个本机函数:
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
}
作为fadden explained, you cannot change the preview buffer that is connected to SurfaceTexture. But you can obtain the preview buffers with onPreviewFrame()
, modify it and push the result to OpenGL via glTexSubImage2D()
。有两个陷阱:您应该隐藏实际预览(可能将其连接到在您的 GL 表面上不可见的纹理),并且您应该足够快地进行所有处理(至少 "preview" 到 20 FPS看起来很自然)。
我正在使用 GLSurfaceView
activity 在 android 设备上显示相机框架。由于我是 OpenGl Es
的新手,我想知道如何获取图像缓冲区并对其进行修改,然后在 phone 上显示修改后的帧?
在实现 GLSurfaceView.Renderer
的渲染器 class 中,我调用了一个本机函数:
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
}
作为fadden explained, you cannot change the preview buffer that is connected to SurfaceTexture. But you can obtain the preview buffers with onPreviewFrame()
, modify it and push the result to OpenGL via glTexSubImage2D()
。有两个陷阱:您应该隐藏实际预览(可能将其连接到在您的 GL 表面上不可见的纹理),并且您应该足够快地进行所有处理(至少 "preview" 到 20 FPS看起来很自然)。