【问题标题】:Does PNG_COLOR_MASK_ALPHA map to a particular OpenGL color format?PNG_COLOR_MASK_ALPHA 是否映射到特定的 OpenGL 颜色格式?
【发布时间】:2014-08-18 20:31:14
【问题描述】:

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

在运行 png gauntlet 以优化纹理后,调用 png_get_IHDR() 返回颜色类型 PNG_COLOR_MASK_ALPHA 我有点困惑这是否可以直接映射到我在传递给 @987654325 时使用的颜色格式@。

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

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

【问题讨论】:

  • 我相信GL_LUMINANCE_ALPHA 会起作用,但是,它已在 OpenGL 版本 3 及更高版本上被弃用。在这种情况下,您可以将其替换为GL_RG。您的目标是哪个版本?
  • 谢谢,这段代码不会很快从 ES 2 更改,所以我认为 GL_LUMINANCE_ALPHA 应该可以解决问题,但我需要试一试。感谢您对弃用的提醒。

标签: opengl-es-2.0 libpng image-optimization


【解决方案1】:

彩色 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。

我认为处理转换最安全的方法是使用 (after 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() 只是复制将灰色通道分为绿色和蓝色通道,并将灰色通道用作红色通道。

【讨论】:

  • 感谢您的回答。是的,我明白他们的意思。这个问题更多地与它如何等同于 glTexImage2D() 使用的颜色格式有关。 glTexImage2D() 的文档听起来像 GL_LUMINANCE_ALPHA 是相关的颜色,但我想问问周围的人,以防有人确定。
猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2010-09-19
相关资源
最近更新 更多