Буфер рендеринга Android EGL sRGB по умолчанию

В OpenGL ES я могу создавать буферы рендеринга sRGB, используя либо OpenGL ES 3.0, либо OpenGL ES 2.0 с расширением GL_EXT_sRGB. Я создаю визуализируемую текстуру с внутренним форматом GL_SRGB8_ALPHA8 (или GL_SRGB8_ALPHA8_EXT), и она отлично работает на устройствах Android, которые ее поддерживают.

Однако я не могу найти способ заставить буфер рендеринга по умолчанию использовать sRGB на Android. Я использую GLSurfaceView, поэтому он проходит через EGL и eglChooseConfig, но я не могу найти, какой атрибут, если он есть, управляет настройкой sRGB.

Я, конечно, могу обойти это путем рендеринга в целевой sRGB, а затем копирования в резервный буфер перед отображением, но это довольно расточительно. Это было намного проще сделать в OpenGL и DirectX, но OpenGL ES требует, чтобы настройка sRGB применялась при создании буфера рендеринга/буфера кадров.

Любые идеи?


person Muzza    schedule 05.12.2013    source источник


Ответы (1)


Вы определенно на правильном пути, единственный способ получить кадровый буфер sRGB по умолчанию в OpenGL ES — пройти через EGL. Теперь EGL 1.4 не имеет встроенной поддержки различных цветовых пространств в кадровом буфере GL по умолчанию, однако есть расширение, которое может поддерживать ваша система, называемое EGL_KHR_gl_colorspace.

Если ваша реализация EGL поддерживает это расширение, вы можете передать следующую пару атрибутов в EGL при создании поверхности окна:

EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR

Теперь все становится немного забавным... константа EGL_GL_COLORSPACE_SRGB_KHR имеет то же значение, что и EGL_VG_COLORSPACE_sRGB в EGL 1.3. EGL_VG_COLORSPACE_sRGB назывался EGL_COLORSPACE_sRGB в EGL 1.2. Если цветовые пространства sRGB OpenGL будут переведены в ядро ​​для EGL 1.5, эта вещь, вероятно, будет снова переименована - обратно к тому, как она называлась в EGL 1.2;)

Короче говоря, если ваша реализация поддерживает это расширение, вы также можете использовать константы EGL_VG_COLORSPACE... для поверхности OpenGL. Он в основном расширяет функциональность OpenVG до OpenGL, вплоть до использования одних и тех же числовых значений для констант.

person Andon M. Coleman    schedule 20.12.2013
comment
Принято как правильный ответ. Это то, что я уже пытался сделать, но, похоже, это не удалось, потому что у меня нет устройств, поддерживающих необходимое расширение EGL. Даже устройства OpenGL ES 3.0, которые полностью поддерживают sRGB в OpenGL ES, такие как Nexus 7 2-го поколения, в настоящее время не предоставляют расширение EGL, что является немного раздражающим ограничением. Похоже, мне нужно дождаться обновлений программного обеспечения или новых устройств, чтобы использовать эту функцию. - person Muzza; 04.01.2014