相机顶部的 OpenGL 视图的替代方法
Posted
技术标签:
【中文标题】相机顶部的 OpenGL 视图的替代方法【英文标题】:Alternative approach to OpenGL View on top of Camera 【发布时间】:2011-06-03 16:26:40 【问题描述】:在前面使用 OpenGL 进行相机预览背景的传统方法是获取两个 SurfaceView(一个用于相机,另一个用于 OpenGL)并将它们堆叠在一起。 问题是不鼓励堆叠 SurfaceView:
http://groups.google.com/group/android-developers/browse_thread/thread/4850fe5c314a3dc6
那么有什么替代品呢?我正在考虑以下几点:
-
子类GlSurfaceView,然后调用设置相机预览到这个子类的持有人:Camera.setPreviewDisplay(mHolder);
不要使用 GLSurfaceView,而是创建您自己的 SurfaceView 子类,您可以在其中将相机预览显示到支架上并绘制您的 openGL。这需要在没有 GLSurfaceView 的情况下使用 OpenGL,以前有人这样做过吗?
我不确定这是否可能或是否有意义,因为这意味着将相机预览显示到表面的支架上,同时在同一表面上绘制 OpenGL。 在不使用两个 SurfaceView 的情况下解决问题是否有其他明智的选择?
谢谢!
【问题讨论】:
为什么不在 OpenGL 中简单地绘制多个图层呢? OpenGL不是场景图,它只是在屏幕上绘制三角形,并且可以在过程中随时任意改变投影。 @datenwolf,为什么不作为答案发布? :) @Kos:因为那可能不是 OP 的实际意图。 @datenwolf:问题是要在 OpenGL 中绘制,相机图像必须是 RGB 格式,但它们不是,所以你必须即时转换它们。这是可能的,但速度很慢。 【参考方案1】:您可以将相机绘制到屏幕外的画布上,然后在 opengl 中将其渲染为纹理。我用谷歌地图做这个,不确定Camera API是否也可以做这个。
对于相机来说可能不合理,因为绑定纹理的开销很大,而且我很少这样做,每秒调用 20-30 次 bindtexture 以使相机平滑,这使得堆叠表面视图听起来非常好想法。
编辑:您可以在没有 GlSurfaceView 的情况下使用 GL,但您需要使用 EGL 并手动管理表面。
【讨论】:
您知道是否可以让相机将图像显示到 SurfaceViews SurfaceHolder 上,同时在同一个 SurfaceView 上绘制 openGl 图像?【参考方案2】:我的建议:只需将所有内容都绘制到单个 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_*_layer() 函数的开头。
【讨论】:
问题在于,要在 OpenGL 中绘制,相机图像必须是 RGB 格式,但它们不是,因此您必须即时转换它们。这是可能的,但速度很慢。 您可以使用着色器将 YUV 转换为 RGB,请参阅第 17 页的billmark.com/teach/cs395T-03-spring/presentations/…。此示例需要在 Android 上进行调整,因为相机会在一个平面上生成具有 V 和 U 像素的半平面 YUV。 【参考方案3】:我还没有使用它,所以我不太了解它,但您可能会发现SurfaceTexture 有用。
【讨论】:
以上是关于相机顶部的 OpenGL 视图的替代方法的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV + OpenGL - 获取 OpenGL 图像作为 OpenCV 相机