2011-10-18 31 views
5

与えられたファイルからRGBのバイト配列をロードするとします。OpenGLテクスチャを反転する必要がありますか?

私は、OpenGLがそのテクスチャを "逆"に保存するのが好きで、イメージを保存しているデモプログラムが逆さまになっているのを見ました。

私のプログラムでは、ロードされたRGB配列を1バイトずつ、または1行ずつ逆にする必要がありますか?

答えて

6

ビットマップ(.bmp)形式は、その行が逆さまになっているためです。私は誰がそれを思いついたのか分からないが、それはファイル形式のものだ。つまり、独自の.bmpローダーを使用する場合は、そうする必要があります。しかし、既に書かれたものを使用することができます。"裏返し"あなたのためのイメージです。再び、それは唯一の.bmpのものです。 OpenGLは、反転されていないイメージではデフォルトで動作します。

ここで少しトリックです:あなたは.BMPローダーを変更したくない場合は、あなたがあなたのために画像を反転するためにOpenGLを伝えることができます。

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 
glScalef(1.0f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 

私は、「デフォルトでは」と何を意味するかです。必要に応じて、OpenGLを上下逆にすることができます。しかし、これはあなたがロードする.bmpファイルの場合にのみ有効です。他のファイル形式では、行が正しく保存されます。したがって、私は最初のアプローチ - 実際の.bmpローダーを使用する方が好きです。

ただ、明確にするために:あなたが.bmpファイルをロードする場合は、(ほとんどの.bmpローダーが行う)のOpenGLに送信する前に、どちらの手で画像を反転、ORがにunflipped画像を送らなければなりませんOpenGLを使用して、レンダリングコードの前に上記のコードを追加します。

+0

実際、フリップされたすべての画像はBMPです。しかし、どのようにOpenGLがテクスチャ座標を取るのか? (0,0)は最後の行の最初のピクセルにあり、私は右で、(1,1)は最初の行の最後のピクセルですか?これが正しいために配列を反転する必要はありませんか? –

+0

さて、それは異なります!生のBMPデータを取り出してOpenGLに送ると、(0,0)が突然最初の行の最初のピクセルになります。再度(0,0)を最初の行の最後のピクセルにしたい場合は、配列を反転してからOpenGLに送信する必要があります。代わりに上記のTexture-matrix-scalingコードがあります。 –

+0

@catfish_deluxe_call_me_cdいいえ! (0,0)は、最初の行の最初のピクセルです。 OpenGLでは、イメージの行が下から上にソートされていますが、原点はイメージデータの最初の行の最初のピクセルに残ります**あなたはOpenGLに送信します。 –

関連する問題