2016-04-06 6 views
1

OS Xで動作しています。SDL_Imageライブラリを使用してOpenGLでテクスチャをロードしました(SDL_Surface*を返すIMG_LOAD()を使用)。カラーチャンネルがスワップされたようです。すなわち、glTexImage2D()にピクセル形式のパラメータとしてGL_BGRAを設定する必要がありました。SDLでピクセルデータフォーマットを確認する

単にテクスチャをコンパイルしてチェックするだけでなく、正しいデータフォーマット(BGRAまたはRGBAなど)を決定する方法はありますか? SDLがこれらのカラーチャネルを交換する理由は何ですか?

+1

私は答えを投稿しようとしていましたが、私は解決策の大きな部分を失っていることに気付きました。基本的にBGRAは、多くのシステムで符号なし8ビットの正規化テクスチャに優先されます。他のタイプではRGBAが使用される傾向があります。しかし、SDL_Imageにどのような形式で出力するかを尋ねる方法を見つけることができませんでした。これは、OpenGLに伝える内容と一致するかどうかを判断する重要な要素です。しかし、今日では、おそらくあなたが合理的なシステムにロードする画像は、BGRAの注文になるでしょう。 HDRファイルの場合、RGBAまたはARGBがポップアップすることがあります。 –

答えて

1

はい。 http://wiki.libsdl.org/SDL_PixelFormat#Code_Examples

サイトから:

SDL_PixelFormat *fmt; 
SDL_Surface *surface; 
Uint32 temp, pixel; 
Uint8 red, green, blue, alpha; 
. 
. 
. 
fmt = surface->format; 
SDL_LockSurface(surface); 
pixel = *((Uint32*)surface->pixels); 
SDL_UnlockSurface(surface); 

/* Get Red component */ 
temp = pixel & fmt->Rmask; /* Isolate red component */ 
temp = temp >> fmt->Rshift; /* Shift it down to 8-bit */ 
temp = temp << fmt->Rloss; /* Expand to a full 8-bit number */ 
red = (Uint8)temp; 

あなたは値によってXmasksを並べ替えることができる必要があり、以下のリンクは、各コンポーネントのチャネルシフトを決定する方法のコード例を持っています。次に、RGBAかBGRAかを判断することができます。 Xmask == 0の場合、カラーチャンネルは存在しません。

スワップがなぜ発生するのかわかりません。

編集:XshiftからXmaskへの変更は、カラーチャンネルの位置と存在の両方を判断するために使用されるため、変更されました。

+1

_スワップがなぜ発生するのかわかりません。ここにはOS Xのバージョンやプロセッサアーキテクチャーが含まれているとは思えませんが、それは他のものよりもそのプラットフォーム上でより一般的な問題です。 –

関連する問題