Конфигурация OpenGL sRGB на Android

Я пытаюсь понять, как включить профиль sRGB для буферов кадров по умолчанию на Android. Android SDK не знает, как это сделать на практике. Например, здесь парень утверждает, что достаточно установить внутренний формат текстуры в sRGB. Но он явно ошибается, потому что я попробовал это, и это ничего не меняет.

Khronos предоставляет это расширение как часть EGL. попытался добавить эти флаги в конфиги поверхности:

    final int EGL_GL_COLORSPACE_KHR = 0x309D;
    final int EGL_GL_COLORSPACE_SRGB_KHR = 0x3089;
    int attribs[] = {
            EGL10.EGL_LEVEL, 0,
            EGL10.EGL_RENDERABLE_TYPE,EGLExt.EGL_OPENGL_ES3_BIT_KHR,
            EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER, 
            EGL10.EGL_RED_SIZE, 8,
            EGL10.EGL_GREEN_SIZE, 8,
            EGL10.EGL_BLUE_SIZE, 8,
            EGL10.EGL_DEPTH_SIZE, maxDepth,
            EGL10.EGL_SAMPLE_BUFFERS, 1,
            EGL10.EGL_SAMPLES, 4, 
            EGL_GL_COLORSPACE_KHR ,EGL_GL_COLORSPACE_SRGB_KHR //<--
            EGL10.EGL_NONE
    };

Но в этом случае устройства, на которых я тестирую (Google NEXUS 6), приводят к сбою приложения. Запустив средство просмотра расширений OpenGL, я вижу, что устройство не поддерживает

EGL_KHR_gl_colorspace

расширение.

На самом деле я нашел здесь и в других онлайн-демонстрациях эта настройка действительно используется. Кроме того, iOS позволяет настроить FBO по умолчанию на sRGB с флагом:

kEAGLЦветФорматSGBA8

Есть ли другой способ включить sRGB на устройстве Android, кроме этого расширения? (Конечно, другой альтернативой является корректировка гаммы в шейдере, но это именно то, чего я не хочу делать)


person Michael IV    schedule 16.06.2017    source источник


Ответы (1)


Нет, к сожалению, нет другого способа создать фреймбуфер sRGB по умолчанию.

Что вы можете сделать, так это использовать обходной путь: визуализировать текстуру с внутренним форматом GL_SRGB8_ALPHA8 и рассматривать ее как ваш фреймбуфер, а затем в конце нарисовать полноэкранный четырехугольник в фреймбуфере по умолчанию, используя вышеупомянутую текстуру и шейдер гамма-коррекции. (Вы получите значения в линейном RGB при чтении из текстуры, поэтому вам нужно сжать их обратно в sRGB при записи в буфер кадра по умолчанию; буфер кадра якобы линейный, но значения в нем будут интерпретироваться дисплеем как sRGB. .)

«Другой парень» был совершенно прав, но фреймбуфер по умолчанию не является текстурой, и вы не можете напрямую установить его внутренний формат.

person Krzysztof Kosiński    schedule 13.06.2018