3

在前面使用 OpenGL 进行相机预览背景的传统方法是采用两个 SurfaceView(一个用于相机,另一个用于 OpenGL)并将它们堆叠在一起。问题是不鼓励堆叠 SurfaceView:

http://groups.google.com/group/android-developers/browse_thread/thread/4850fe5c314a3dc6

那么有哪些替代方案呢?我正在考虑以下内容:

  1. 子类GlSurfaceView,然后调用set the Camera preview到这个子类的holder上:Camera.setPreviewDisplay(mHolder);
  2. 不要使用 GLSurfaceView,而是创建您自己的 SurfaceView 子类,您可以在其中将相机预览显示到支架上并绘制您的 openGL。这需要在没有 GLSurfaceView 的情况下使用 OpenGL,以前有人这样做过吗?

我不确定这是否可能或是否有意义,因为这意味着将相机预览显示到表面的支架上,同时在同一表面上绘制 OpenGL。在不使用两个 SurfaceView 的情况下解决问题是否有其他明智的选择?

谢谢!

4

3 回答 3

0

我还没有使用它,所以我不太了解它,但您可能会发现SurfaceTexture很有用。

于 2013-09-13T12:17:06.807 回答
0

我的建议:只需将所有内容绘制到单个 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() 函数的开头一样。

于 2011-01-05T09:31:52.310 回答
0

您可以将相机绘制到屏幕外的画布上,然后在 opengl 中将其渲染为纹理。我使用 Google Maps 执行此操作,不确定 Camera API 是否也可以执行此操作。

对于相机来说,可能不像绑定纹理那样合理,因为绑定纹理的开销很大,而且我很少这样做,每秒调用 20-30 次 bindtexture 以使相机平滑,这使得堆叠表面视图听起来是一个非常好的主意。

编辑:您可以在没有 GlSurfaceView 的情况下使用 GL,但您需要使用 EGL 并手动管理表面。

于 2011-01-04T23:44:06.747 回答