【问题标题】:PNG image texture format for color type 3颜色类型 3 的 PNG 图像纹理格式
【发布时间】:2012-12-31 15:20:13
【问题描述】:

我有一个 128x128 尺寸的 PNG 图像。当我用 libpng 读取它的 IHDR 块时,它显示图像的颜色类型为 3。问题是我无法在任何地方找到这种颜色类型的纹理格式。我想用 OpenGL 绘制这个图像。但是如果没有正确的纹理格式,图像颜色就不是它应该的样子。而且,如果可以提供任何参考资料,我将不胜感激。

我用这个方法来设置其他颜色类型的纹理格式

inline void GetPNGtextureInfo (int color_type,GLuint *format)
{

switch (color_type)
{
    case PNG_COLOR_TYPE_GRAY:
        *format = GL_LUMINANCE;
        break;

    case PNG_COLOR_TYPE_GRAY_ALPHA:
        *format = GL_LUMINANCE_ALPHA;
        break;

    case PNG_COLOR_TYPE_RGB:
        *format = GL_RGB;
        break;

    case PNG_COLOR_TYPE_RGB_ALPHA:
        *format = GL_RGBA;
        break;

    default:
        break;
  }
}

【问题讨论】:

  • 颜色类型 = 3 表示索引颜色。 (OpenGL 应该)寻找包含 RGB 三元组列表的 PLTE 块。
  • glTexImage2D 函数在我绘制以纹理格式作为参数之一的图像时使用。我不明白如何读取 PLTE 块以获取 RGB 颜色然后设置纹理格式?
  • PLTE 块只是一个字节列表 R,G,B,R,G,B,... 直到块结束。
  • 谢谢,现在我可以从调色板中读取 rgb 值了。但问题是它的红色 = f,绿色 = f,蓝色 = f。如何将其转换为纹理格式?

标签: c++ opengl png textures libpng


【解决方案1】:

调色板只是一个颜色数组,图像数据只是该数组的索引。

因此,如果要将图像转换为 RGB 图像,请为该格式的图像分配一个足够大的新缓冲区,并通过从源图像中获取像素索引来填充它,并使用该值索引调色板,并将得到的 RGB 值存储到目标图像中。

您可能会发现支持调色板纹理的 GL 风格,并且可以直接加载它们,但如今硬件支持已不常见,您所做的只是将工作卸载到驱动程序,这将将您的纹理转换为 24 位。

例如,OpenGL ES 通过 glCompressedTexImage2D() 函数支持某些类型的调色板纹理,但这完全有可能只是给实现带来负担,将这些纹理转换为硬件可以处理的东西。

除非您有存储空间问题,否则我倾向于离线转换(即首先将您的图像保存为 24 位),但这两种方式在技术上并不困难。

【讨论】:

  • 我需要做的是为OpenGLES的函数glTexImage2D()设置一个纹理格式。我已经用 libpng 阅读了 png 文件。但是我不能为颜色类型 3 设置纹理格式。我可以为其他颜色类型设置纹理格式。像 0 (PNG_COLOR_TYPE_GRAY) 我将纹理格式设置为 0x1909 (GL_LUMINANCE)。但我不知道如何处理颜色类型 3。
  • 我在帖子中添加了用于为其他颜色类型设置纹理格式的功能。
  • 我建议您将纹理转换为与现有类型之一兼容的东西,例如 GL_RGB。
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2011-06-12
  • 2014-11-24
  • 1970-01-01
相关资源
最近更新 更多