Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 摄像机顶部OpenGL视图的替代方法_Android_Opengl Es_Camera_Android Camera - Fatal编程技术网

Android 摄像机顶部OpenGL视图的替代方法

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进行摄影机预览背景的传统方法是,获取两个SurfaceView(一个用于摄影机,另一个用于OpenGL),并将它们堆叠在彼此的顶部。 问题是不鼓励堆叠SurfaceView:

那么,还有什么选择呢?我当时考虑的是:

  • 子类GlSurfaceView,然后调用set the Camera preview到该子类的保持架上:Camera.setPreviewDisplay(mHolder)
  • 不要使用GLSurfaceView,而是创建自己的SurfaceView子类,在该子类中,您可以在支架上显示相机预览,还可以绘制openGL。这将需要在没有GLSurfaceView的情况下使用OpenGL,以前有人这样做过吗
  • 我不确定这是否可能或有意义,因为这意味着在曲面的支架上显示相机预览,同时在同一曲面上绘制OpenGL。 除了不使用两个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图像?