2015-05-19 2 views
0

У меня есть графический глюк, связанный с смешиванием в моем приложении OpenGL с использованием Android NDK.Выход adb screencap отличается от устройства

Странная вещь: когда я снимаю снимок экрана с помощью команды adb screencap, проблема полностью исчезает, и результат выглядит нормально.

Мой вопрос: Есть ли способ узнать, что происходит за кулисами создания скриншотов? Есть ли eglChooseConfig, вызываемый с определенными значениями для всего кадра, например? Или, может быть, возникает какое-то определенное начальное состояние GL?

Некоторые фона:

Мое устройство использует Qualcomm Adreno 320.

glich происходит, когда я звоню glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) для некоторых из геометрии.

Я также обнаружил, что настройка glColorMask(1, 1, 1, 0) приводит к черному экрану на моем устройстве (и только на этом устройстве), в то время как при съемке скриншотов получается полная правильная игровая рамка.

Приложение не выводит глюков на несколько других устройств Android, а другие приложения работают хорошо, даже те, которые широко используются для смешивания.

ответ

1

Проблема исчезла, как только я закомментирована EGL_ALPHA_SIZE установки:

const EGLint attribs[] = { 
    EGL_BLUE_SIZE, 8, 
    EGL_GREEN_SIZE, 8, 
    EGL_RED_SIZE, 8, 
    //EGL_ALPHA_SIZE, 8, 
    EGL_NONE 
}; 

Похоже, с альфа-набором до 8 бит, eglChooseConfig возвращается проблемный объект конфигурации.

Забавно, что «правильный» EGLConfig указывает 0 бит для EGL_ALPHA_SIZE, поэтому сначала я ожидал, что он не будет работать вообще. Другие устройства действительно не заботятся о ценности, и они хорошо выполняют только глубины каналов RGB.

Я узнал урок: если на вашем устройстве имеются графические сбои, всегда проверяйте все возможные конфигурации EGL!

Итак, мой вывод: да, возможно, есть пользовательский набор EGLConfig, расположенный внутри adb screencap.

+1

FWIW, Grafika выбирает альфа-размер как 8 (https://github.com/google/grafika/blob/master/src/com/android/grafika/gles/EglCore.java#L144), и я никогда не видел ничего странного. Я бы предположил, что большинство приложений GLES используют эту конфигурацию (32-разрядный RGBA). Код захвата экрана объединяет выводимый вывод, и я бы не ожидал, что конфигурация EGL, используемая для blitting, будет иметь эффект «фиксации» рендеринга. Так что это очень интересная точка данных, но я подозреваю, что в ней есть что-то большее. Возможно, стоит восстановить альфа-размер и добавить 'EGL_RENDERABLE_TYPE', чтобы узнать, не изменилось ли это. – fadden

+0

Правильно - я не думал об этих других переменных конфигурации. Хотя, я пробовал точно все 9 конфигураций с EGL_ALPHA_SIZE без комментирования, и все они приводили неверные результаты. Я не думаю, что решение этой тайны стоит приложить усилия, это, скорее всего, одна из ошибок драйверов, которые, как известно, имеют эти модели, и этот даже не поддерживает glBlendFuncSeparate (!) –

2

Вообще говоря, устройства не имеют фреймбуфера с пикселями, которые вы можете копировать при захвате экрана. Функции «захвата экрана» на самом деле «перерисовывают экран в буфер». Возможно, что захват экрана немного отличается, преднамеренно, если на экране отображается «защищенный» уровень или контент DRM.

Является ли это единой, полностью непрозрачной поверхностью? Или это смешивается с другим слоем выше или ниже?

Наиболее распространенной причиной различий являются ошибки в аппаратном композиторе, но похоже, что вы видите рендеринг проблем на одной поверхности, так что это менее вероятно. Если у вас есть внедренное устройство, вы можете включить и отключить композицию HWC, используя команды, показанные here: adb shell service call SurfaceFlinger 1008 i32 1 отключит наложения и состав GLES. (Если ничего из этого не имеет смысла, прочитайте документ graphics architecture).

Вы можете размещать изображения правильных и сбитых изображений? (Один на скриншот, один - снимок устройства со вторым устройством.)

Вы видите похожие проблемы, если вы записываете экран с помощью adb shell screenrecord?

+0

Большое спасибо за ваш ценный вклад. Я решил проблему, прежде чем обойтись, следуя намекам, которые вы предоставили. Я собираюсь принять свой собственный ответ, чтобы каждый мог видеть истинную причину проблемы, но у вас есть моя возвышенность. –