3

前面にOpenGLを使用してカメラプレビューの背景を作成する従来の方法は、2つのSurfaceView(1つはカメラ用、もう1つはOpenGL用)を取得し、それらを互いに積み重ねることです。問題は、SurfaceViewsのスタックが推奨されていないことです。

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

では、どのような選択肢がありますか?私は次のことを考えていました:

  1. サブクラスGlSurfaceViewを呼び出してから、カメラプレビューをこのサブクラスのホルダーに設定します。Camera.setPreviewDisplay(mHolder);
  2. GLSurfaceViewを使用しないでください。代わりに、独自のSurfaceViewサブクラスを作成して、カメラプレビューをホルダーに表示し、openGLを描画します。これには、GLSurfaceViewなしでOpenGLを使用する必要がありますが、これを以前に行ったことはありますか?

これが可能かどうかはわかりません。これは、カメラプレビューをサーフェスのホルダーに表示すると同時に、同じサーフェスにOpenGLを描画することを意味するためです。2つのSurfaceViewを使用せずに問題を解決するための他の賢明な代替手段はありますか?

ありがとう!

4

3 に答える 3

0

カメラをオフスクリーンキャンバスに描画してから、openglでテクスチャとしてレンダリングすることもできます。私はGoogleマップでこれを行いますが、CameraAPIでもこれを実行できるかどうかはわかりません。

テクスチャをバインドすることはオーバーヘッドが大きいため、カメラにとって合理的ではないかもしれません。カメラをスムーズにするために1秒間に20〜30回バインドテクスチャを呼び出すと、スタックサーフェスビューが非常に良いアイデアのように聞こえます。

編集:GlSurfaceViewなしでGLを使用できますが、EGLを使用して、サーフェスを手動で管理する必要があります。

于 2011-01-04T23:44:06.747 に答える
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

私はまだ使っていないのでよくわかりませんが、SurfaceTextureが役に立つかもしれません。

于 2013-09-13T12:17:06.807 に答える