1

我有一个 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;
  }
}
4

1 回答 1

1

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

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

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

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

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

于 2013-01-17T09:41:13.240 回答