颜色 PNG 掩码在 libpng 的 png.h 中定义:
/* 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 colortype 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),两者都直接等效于 glTexImage2D 版本 1.1 或版本 3 中的 GL 格式 GL_RGB 或 GL_RGBA。特别是, png_set_gray_to_rgb() 只是复制灰色通道进入绿色和蓝色通道,并使用灰色通道作为红色通道。