Сопоставляется ли PNG_COLOR_MASK_ALPHA с определенным цветовым форматом OpenGL?

Я немного запутался после запуска png gauntlet на некоторых текстурных ресурсах png. Раньше все они были либо PNG_COLOR_TYPE_RGB, либо PNG_COLOR_TYPE_RGBA, и поэтому сопоставление их с соответствующим цветовым форматом GL было достаточно простым. Полное раскрытие, я не мастер графики.

После запуска png gauntlet для оптимизации текстур вызов png_get_IHDR() возвращает тип цвета PNG_COLOR_MASK_ALPHA, и я немного смущен тем, может ли это напрямую отображаться в цветовой формат, который я использую при переходе к glTexImage2D().

Конкретное изображение текстуры, которое ведет себя таким образом, представляет собой спрайт, в основном состоящий из белого и серого цветов с различными значениями альфа-канала. Мое лучшее предположение здесь состоит в том, что оптимизация определила, что это какая-то шкала серого с альфой, и поэтому мне нужно обнаружить это в моем коде загрузки текстуры.

Я бы подумал, что, возможно, подходящим типом цвета будет GL_LUMINANCE_ALPHA, поскольку он использует значение яркости в качестве компонентов R, G и B, что по сути будет шкалой серого с альфа-каналом.


person Joey Carson    schedule 18.08.2014    source источник
comment
Я считаю, что GL_LUMINANCE_ALPHA будет работать, однако он устарел в OpenGL версии 3 и выше. В таком случае вы, вероятно, можете заменить его на GL_RG. На какую версию вы ориентируетесь?   -  person glampert    schedule 19.08.2014
comment
Спасибо, этот код не изменится с ES 2 в ближайшее время, поэтому я думаю, что GL_LUMINANCE_ALPHA должен помочь, но мне нужно попробовать. Спасибо за предупреждение об устаревании.   -  person Joey Carson    schedule 19.08.2014


Ответы (1)


Цветовые маски PNG определены в файле png.h libpng:

/* color type masks */
#define PNG_COLOR_MASK_PALETTE    1
#define PNG_COLOR_MASK_COLOR      2
#define PNG_COLOR_MASK_ALPHA      4

/* color types.  Note that not all combinations are legal */
#define PNG_COLOR_TYPE_GRAY 0
#define PNG_COLOR_TYPE_PALETTE  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
#define PNG_COLOR_TYPE_RGB        (PNG_COLOR_MASK_COLOR)
#define PNG_COLOR_TYPE_RGB_ALPHA  (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) /* aliases */
#define PNG_COLOR_TYPE_RGBA  PNG_COLOR_TYPE_RGB_ALPHA

Они относятся к типам цвета, определенным в спецификации PNG, которые

0: Gray (1 channel)
2: RGB  (3 channels)
3: color palette (1 channel)
4: Gray-alpha (2 channels)
6: RGBA (4 channels)

В glTeximage2D версии 1.1 цветовой тип PNG 0 эквивалентен GL_LUMINANCE_ALPHA. В glTexImage2D версии 3 цветовой тип PNG 0 не имеет прямой эквивалентности. Одноканальный формат GL — GL_RED, но это означает, что сэмплы помещаются только в красный канал, а зеленый и синий каналы установлены на 0.

Я думаю, что самый безопасный способ справиться с преобразованием — это использовать (после png_get_IHDR(...))

png_set_gray_to_rgb(png_ptr);
png_set_palette_to_rgb(png_ptr);
png_read_update_info(png_ptr);

Это гарантирует, что вы получите только цветотип 2 (RGB) или 6 (RGBA), оба из которых имеют прямую эквивалентность форматам GL GL_RGB или GL_RGBA либо в glTexImage2D версии 1.1, либо в версии 3. В частности, png_set_gray_to_rgb() просто копирует канал серого. в зеленый и синий каналы и использует серый канал в качестве красного канала.

person Glenn Randers-Pehrson    schedule 19.08.2014
comment
Спасибо за Ваш ответ. Да я понимаю, что они имеют в виду. Вопрос был больше связан с тем, как он соответствует цветовому формату, используемому с glTexImage2D(). Документация для glTexImage2D() звучит так, будто GL_LUMINANCE_ALPHA — это связанный цвет, но я хотел спросить, может кто-нибудь знает наверняка. - person Joey Carson; 19.08.2014