私のC++アプリケーションでは、赤、緑、青の値でpng画像の色を使用しています。これらの値を3つの整数で格納しました。
RGB値を同等の16進値に変換するにはどうすればよいですか?
この形式のような例0x1906
編集:フォーマットをGLuintとして保存します。
各色の適切なビットを、少なくとも24ビットの符号なし整数(のようにlong
)に格納します。
unsigned long createRGB(int r, int g, int b)
{
return ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff);
}
今の代わりに:
unsigned long rgb = 0xFA09CA;
できるよ:
unsigned long rgb = createRGB(0xFA, 0x09, 0xCA);
上記はアルファチャネルを扱っていないことに注意してください。アルファ(RGBA)もエンコードする必要がある場合は、代わりにこれが必要です。
unsigned long createRGBA(int r, int g, int b, int a)
{
return ((r & 0xff) << 24) + ((g & 0xff) << 16) + ((b & 0xff) << 8)
+ (a & 0xff);
}
それが必要な場合は、と交換unsigned long
してください。GLuint
文字列を作成する場合は、おそらく次を使用できますsnprintf()
。
const unsigned red = 0, green = 0x19, blue = 0x06;
char hexcol[16];
snprintf(hexcol, sizeof hexcol, "%02x%02x%02x", red, green, blue);
これにより、文字列001906" in
hexcol`が作成されます。これは、例の色を解釈するために選択した方法です(6桁の場合は4桁のみです)。
プリプロセッサシンボルがOpenGLのヘッダーファイルGL_ALPHA
にあると定義されているという事実に混乱しているようです。0x1906
これは色ではなく、ピクセルを処理するOpenGL API呼び出しで使用される形式指定子であるため、予想される形式を認識しています。
PNG画像がメモリにある場合、GL_ALPHA
形式は画像内のアルファ値(存在する場合)のみに対応します。上記は文字列を作成するため、まったく異なるものです。OpenGLは文字列を必要とせず、必要な形式でデータを保持するメモリ内バッファが必要になります。
glTexImage2D()
これがどのように機能するかについては、マニュアルページを参照してください。