1

在一些 png 纹理资产上运行 png gauntlet 后,我​​有点困惑。以前它们都是PNG_COLOR_TYPE_RGBPNG_COLOR_TYPE_RGBA,因此将它们映射到适当的 GL 颜色格式非常简单。完全披露,我不是图形大师。

在运行 png gauntlet 以优化纹理后,调用png_get_IHDR()返回颜色类型PNG_COLOR_MASK_ALPHA,我有点困惑这是否可以直接映射到我在传递到glTexImage2D().

以这种方式表现的特定纹理图像是一个主要由具有不同 alpha 值的白色和灰色组成的精灵。我最好的猜测是优化确定它是某种带有 alpha 的灰度,因此我需要在我的纹理加载代码中检测到这一点。

我认为合适的颜色类型可能是GL_LUMINANCE_ALPHA,因为它是使用亮度值作为 R、G 和 B 分量的颜色类型,它本质上是带有 alpha 通道的灰度。

4

1 回答 1

0

颜色 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() 只是复制灰色通道进入绿色和蓝色通道,并使用灰色通道作为红色通道。

于 2014-08-19T02:17:33.817 回答