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 に答える