Альтернативный подход к OpenGL View сверху камеры - PullRequest
3 голосов
/ 05 января 2011

Традиционный способ сделать фон предварительного просмотра камеры с OpenGL спереди - это взять два SurfaceViews (один для камеры, другой для OpenGL) и сложить их друг на друга.Проблема в том, что стекирование SurfaceViews не рекомендуется:

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

Итак, какие есть альтернативы?Я думал о следующем:

  1. Подкласс GlSurfaceView, а затем вызовите установку предварительного просмотра камеры на держатель этого подкласса: Camera.setPreviewDisplay (mHolder);
  2. Не используйте GLSurfaceViewвместо этого создайте свой собственный подкласс SurfaceView, в котором вы отобразите предварительный просмотр камеры на держателе, а также нарисуете свой openGL.Для этого потребуется использовать OpenGL без GLSurfaceView, кто-нибудь делал это раньше?

Я не уверен, возможно ли это вообще или имеет смысл, поскольку это подразумевает отображение предварительного просмотра камеры на держателеповерхность и в то же время рисование OpenGL на той же поверхности.Есть ли другая разумная альтернатива решению проблемы без использования двух SurfaceView?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 января 2011

Мое предложение: просто нарисуйте все на одной поверхности 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 ().

0 голосов
/ 13 сентября 2013

Я еще не использовал его, поэтому не знаю много об этом, но вы можете найти SurfaceTexture полезным.

0 голосов
/ 05 января 2011

Вы можете нарисовать камеру на холсте за пределами экрана, а затем отобразить ее как текстуру в opengl. Я делаю это с помощью Google Maps, но не уверен, что API камеры также может это делать.

Может быть не так разумно для Camera, так как привязка текстуры требует много времени, и я делаю это редко, когда вызов bindtexture вызывается 20-30 раз в секунду, чтобы сделать камеру гладкой, что делает складывающиеся виды поверхности очень хорошими идея.

Редактировать: вы можете использовать GL без GlSurfaceView, но вам нужно будет использовать EGL и управлять поверхностями вручную.

...