【发布时间】:2013-08-26 16:58:25
【问题描述】:
我正在设计一个具有 OpenGL 处理管道(着色器集合)并同时要求最终用户查看未处理相机预览的应用程序。
举个例子,假设您想向用户显示相机预览,同时计算从相机接收到的场景中红色对象的数量,但您使用的任何着色器都可以计算对象,例如用户不应该看到色调过滤等。
我该如何正确设置?
我知道我可以设置摄像头预览,然后在回调中接收 YUV 格式的摄像头帧数据,然后将其转储到 OpenGL 纹理并以这种方式处理帧,但是,这会带来性能问题。我必须将数据从相机硬件往返传输到 VM,然后将其传递回 GPU 内存。我正在使用SurfaceTexture 直接以 OpenGL 可理解的格式从相机获取数据,并将其传递给我的着色器以解决此问题。
我以为我可以向最终用户显示相同的未处理SurfaceTexture,但TextureView 没有构造函数或设置器,我可以将SurfaceTexture 传递给我希望它呈现。它总是创建自己的。
这是我当前设置的概述:
- GLRenderThread:此类从 Thread 扩展,设置 OpenGL 上下文、显示等,并使用 SurfaceTexture 作为表面(eglCreateWindowSurface 的第三个参数)。
- GLFilterChain:对输入纹理执行检测的着色器集合。
- 相机:使用单独的 SurfaceTexture 作为 GLFilterChain 的输入并抓取相机的预览
- 最后是一个显示 GLRenderThread 的 SurfaceTexture 的 TextureView
显然,通过这种设置,我向用户展示了处理后的帧,这不是我想要的。此外,帧的处理不是实时的。基本上,我通过链运行来自相机的输入一次,一旦完成所有过滤器,我调用updateTexImage 以从相机中获取下一帧。我在 Nexus 4 上的处理速度约为每秒 10 帧。
我觉得我可能需要使用 2 个 GL 上下文,一个用于实时预览,一个用于处理,但我不确定。我希望有人能把我推向正确的方向。
【问题讨论】: