2015-08-17 2 views
0

Для приложения я хочу отображать объекты в фоновом режиме, даже если приложение в настоящее время не отображается. Официальные документы записывают, чтобы открыть GLcontext через GLSurfaceView. Для того, чтобы не отображать графику и рендеринг в другую цель, похоже, не существует реального решения.Как использовать OpenGL без его отображения?

Итак, вопрос в том, как создать GL-контекст без GLSurfaceView в Android?

Использование: запись видео и добавление текущего времени в виде текста непосредственно в видео. Для того, чтобы обработка изображений на основе ЦП была просто медленной, чтобы быть выполненной вживую. По крайней мере, если видео должно также отображаться во время записи. OpenGL может сделать все просто в Framebuffer/Renderbuffer.

+0

Что вы можете наложить полупрозрачный GLSurfaceView в верхней части представления, которое воспроизводит видео. Вы бы отобразили текст с OpenGL в GLSurfaceView, тщательно следя за настройкой альфа-компонента, тогда ОС позаботится о компоновке двух. –

ответ

4

Чтобы сделать рендеринг OpenGL, вам не нужно использовать GLSurfaceView. Если вы посмотрите на source code, вы увидите, что он использует только общедоступные API. Это просто класс удобства, который делает наиболее распространенным использование OpenGL под Android (используя OpenGL для рисования содержимого представления) очень просто. Если ваш вариант использования отличается, вы просто ... не используете его.

API, который вы используете для создания контекстов и поверхностей рендеринга более непосредственно, - это EGL. В фреймворках Android Java доступны две версии: EGL10 и EGL14. EGL10 очень старый, и я настоятельно рекомендую использовать EGL14.

Звонки EGL в документах Android SDK на самом деле не задокументированы, но вы можете использовать man pages on www.khronos.org, чтобы увидеть объясненные вызовы.

Используя EGL напрямую, вы можете создать контекст и поверхность отображения вне экрана, которая позволит вам использовать OpenGL без какого-либо вида.

Я опубликовал полный код, показывающий, как создать контекст с поверхностью отображения вне экрана в предыдущем ответе здесь: GLES10.glGetIntegerv returns 0 in Lollipop only.

1

Уже ответил here и here

Я думаю, что самое простое является то, что описано во второй ссылке, когда они говорят:

набора его размер вида 1pixel & 1pixel, положить его видимый (пользователь не может видеть) и в OnDraw привязать FBO к основной текстуре и сделать ее

Итак, вы все равно создадите GLSurfaceView (только для того, чтобы получить контекст), но вы сделали бы его 1x1 и невидимым.

Или вы могли бы использовать полупрозрачный GLSurfaceView, как это было предложено в моем комментарии (я не уверен, что это будет работать на любом устройстве, это, похоже, немного сложно настроить).

+0

Ваш способ создания небольшого псевдовидимого представления интересен, но не подходит - поскольку для этого требуется работа. Ваша первая ссылка лучше - поскольку она не требует никакого представления. Рендеринг может происходить, например, в службе. Таким образом, я даю +1, но @ reto-koradi получает согласие, так как он описывает более подробные сведения о создании контекста (в чем был вопрос). –

Смежные вопросы