通过 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看起来很自然)。