В отличие от Android, я относительно новичок в GL/libgdx. Задача, которую мне нужно решить, а именно предоставление изображения камеры Android YUV-NV21 на фоне экрана внутри libgdx в реальном времени многогранно. Вот основные проблемы:
-
Изображение предварительного просмотра камеры Android гарантируется только в пространстве YUV-NV21 (и в аналогичном пространстве YV12, где каналы U и V не чередуются, а группируются). Предполагая, что большинство современных устройств обеспечит неявное преобразование RGB, ОЧЕНЬ ошибочно, например, самая новая версия Samsung Note 10.1 2014 содержит только форматы YUV. Поскольку на экране OpenGL ничего нельзя отобразить, если оно не находится в RGB, цветовое пространство должно каким-то образом быть преобразовано.
-
Пример в документации libgdx (Интеграция libgdx и камеры устройства) использует вид поверхности Android, который находится ниже всего, чтобы нарисовать изображение с GLES 1.1. С начала марта 2014 года поддержка OpenGLES 1.x удаляется из libgdx из-за устаревания и почти всех устройств, которые теперь поддерживают GLES 2.0. Если вы попробуете тот же образец с GLES 2.0, 3D-объекты, которые вы рисуете на изображении, будут полупрозрачными. Поскольку поверхность позади не имеет ничего общего с GL, это не может быть действительно контролируемо. Отключение BLENDING/TRANSLUCENCY не работает. Поэтому рендеринг этого изображения должен выполняться исключительно в GL.
-
Это нужно сделать в режиме реального времени, поэтому преобразование цветового пространства должно быть очень быстрым. Преобразование программного обеспечения с использованием растровых изображений Android, вероятно, будет слишком медленным.
-
В качестве побочной функции изображение камеры должно быть доступно из кода Android, чтобы выполнять другие задачи, чем рисовать его на экране, например, отправлять его на собственный процессор изображений через JNI.
Вопрос в том, как выполнить эту задачу должным образом и как можно быстрее?