Альтернативный подход к просмотру OpenGL поверх камеры

традиционный способ сделать фон предварительного просмотра камеры с OpenGL на переднем плане — взять два SurfaceView (один для камеры, другой для 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?

Спасибо!


person Roland    schedule 04.01.2011    source источник
comment
Почему бы просто не нарисовать несколько слоев в OpenGL? OpenGL — это не граф сцены, он просто рисует треугольники на экране, а проекцию можно изменить в любой момент процесса произвольно.   -  person datenwolf    schedule 05.01.2011
comment
@datenwolf, почему бы не опубликовать ответ? :)   -  person Kos    schedule 05.01.2011
comment
@Kos: Потому что это может быть не то, что на самом деле намеревается сделать ОП.   -  person datenwolf    schedule 05.01.2011
comment
@datenwolf: проблема в том, что для рисования в OpenGL изображения с камеры должны быть в формате RGB, но это не так, поэтому вам придется конвертировать их на лету. Это возможно, но медленно.   -  person Roland    schedule 05.01.2011


Ответы (3)


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

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

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

person HaMMeReD    schedule 04.01.2011
comment
Знаете ли вы, возможно ли, чтобы камера отображала изображения на SurfaceHolder SurfaceViews и в то же время также рисовала изображения openGl на том же SurfaceView? - person Roland; 05.01.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().

person datenwolf    schedule 05.01.2011
comment
Проблема в том, что для отрисовки в OpenGL изображения с камеры должны быть в формате RGB, а это не так, поэтому вам придется конвертировать их на лету. Это возможно, но медленно. - person Roland; 05.01.2011
comment
Вы можете использовать шейдер для преобразования YUV в RGB, см. billmark.com/teach/cs395T-03-spring/presentations/, стр. 17. Этот пример нуждается в адаптации для Android, потому что камера создает полуплоский YUV с пикселями V и U в одной плоскости. - person Alex Cohn; 05.09.2012

Я еще не использовал его, поэтому мало что о нем знаю, но вы можете найти Текстура поверхности полезно.

person vg1    schedule 13.09.2013