Android 摄像机顶部OpenGL视图的替代方法
在前面使用OpenGL进行摄影机预览背景的传统方法是,获取两个SurfaceView(一个用于摄影机,另一个用于OpenGL),并将它们堆叠在彼此的顶部。 问题是不鼓励堆叠SurfaceView: 那么,还有什么选择呢?我当时考虑的是:Android 摄像机顶部OpenGL视图的替代方法,android,opengl-es,camera,android-camera,Android,Opengl Es,Camera,Android Camera,在前面使用OpenGL进行摄影机预览背景的传统方法是,获取两个SurfaceView(一个用于摄影机,另一个用于OpenGL),并将它们堆叠在彼此的顶部。 问题是不鼓励堆叠SurfaceView: 那么,还有什么选择呢?我当时考虑的是: 子类GlSurfaceView,然后调用set the Camera preview到该子类的保持架上:Camera.setPreviewDisplay(mHolder) 不要使用GLSurfaceView,而是创建自己的SurfaceView子类,在该子类中
谢谢 您可以将相机绘制到屏幕外的画布上,然后在opengl中将其渲染为纹理。我用谷歌地图来做这件事,不确定摄像头API是否也能做到这一点 对于相机来说,绑定纹理可能不太合理,因为绑定纹理的开销很大,我很少这样做,每秒调用bindtexture 20-30次以使相机平滑,这使得堆叠表面视图听起来是一个非常好的主意
编辑:可以在不使用GLSURFACHEVIEW的情况下使用GL,但需要使用EGL并手动管理曲面 我的建议是:只需将所有内容绘制到一个OpenGL曲面中即可。OpenGL不是场景图,因此在分层中不受某种拓扑的限制。归结起来就是
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
draw_bottom_layer();
glClear(GL_DEPTH_BUFFER_BIT | stencil_used_as_mask ? GL_STENCIL_BUFFER_BIT : 0 );
draw_mid_layer();
glClear(GL_DEPTH_BUFFER_BIT | stencil_used_as_mask ? GL_STENCIL_BUFFER_BIT : 0 );
draw_top_layer();
忘记“初始化”OpenGL的投影、视口之类的东西吧。只要在合适的时候设置它们,就像在每个draw*\u layer()函数的开头一样。我还没有使用过它,所以我对它不太了解,但你可能会发现它很有用。为什么不在OpenGL中简单地绘制多个层呢?OpenGL不是场景图,它只是在屏幕上绘制三角形,投影可以在过程中随时任意更改。@datenwolf,为什么不作为答案发布?:)@Kos:因为这可能不是OP的真实意图。@DatenWalf:问题是,在OpenGL中绘制相机图像必须是RGB格式,但它们不是,所以您必须动态转换它们。这是可能的,但速度很慢。问题是要在OpenGL中绘制相机图像必须是RGB格式,但它们不是,因此您必须动态转换它们。这是可能的,但速度很慢。您可以使用着色器将YUV转换为RGB,请参见第17页。此示例需要在Android上进行调整,因为相机在一个平面上生成具有V和U像素的半平面YUV。您知道是否可以让相机在SurfaceView SurfaceHolder上显示图像,同时在同一SurfaceView上绘制openGl图像?