我正在设计一个具有 OpenGL 处理管道(着色器集合)的应用程序,同时要求最终用户看到未加工的相机预览。
举个例子,假设您想要向用户显示相机预览,同时计算从相机接收到的场景中红色对象的数量,但是您用来计算对象的任何着色器(例如色调过滤)等等不应该被用户看到。
我该如何正确设置呢?
我知道我可以设置相机预览,然后在回调中接收 YUV 格式的相机帧数据,然后将其转储到 OpenGL 纹理中并以这种方式处理帧,但是,这存在与之相关的性能问题。我必须将数据从相机硬件往返到虚拟机,然后将其传回 GPU 内存。我在用着SurfaceTexture
直接以 OpenGL 可理解的格式从相机获取数据并将其传递给我的着色器以解决此问题。
我以为我能够展示同样的未处理的SurfaceTexture
给最终用户,但是TextureView
没有构造函数或设置器,我可以将其传递给SurfaceTexture
我想让它渲染。它总是创造自己的。
这是我当前设置的概述:
- GLRenderThread:该类扩展自Thread,设置OpenGL上下文、显示等,并使用SurfaceTexture作为表面(eglCreateWindowSurface的第三个参数)。
- GLFilterChain:对输入纹理执行检测的着色器集合。
- Camera:使用单独的SurfaceTexture作为GLFilterChain的输入并抓取相机的预览
- 最后是一个显示GLRenderThread的SurfaceTexture的TextureView
显然,通过这种设置,我向用户显示处理后的帧,这不是我想要的。此外,帧的处理不是实时的。基本上,我通过链运行一次来自相机的输入,一旦所有过滤器完成,我调用更新TexImage从相机中抓取下一帧。我在 Nexus 4 上的处理速度约为每秒 10 帧。
我觉得我可能需要使用2个GL上下文,一个用于实时预览,一个用于处理,但我不确定。我希望有人能将我推向正确的方向。
您可以上传一些您正在使用的代码吗?
您也许可以在为最初用于显示预览的表面视图创建并绑定到的纹理上调用 glDrawArrays,然后刷新它并将单独的纹理与其他纹理绑定以进行分析?就像是
GLES20.glUseProgram(simpleProgram);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glUseProgram(crazyProgram);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[1]);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
其中相机的预览表面纹理绑定到纹理[0],然后为纹理[1]创建单独的表面纹理
maybe?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)