11. 色

11.010  テクスチャマップの色の青と赤が逆に、黄色とシアン、その他が逆になっています。どうしてでしょう?

テクスチャーイメージはものの逆のバイト注文を持ち、OpenGLが予期しています。 これを処理する一方の方法は、データをOpenGLに手渡す前にコード内のバイトを交換することです。

OpenGL1.2の下では、「フォーマット」パラメータとしてglDrawPixels()、glGetTexImage()、glReadPixels()、glTexImage1D()、glTexImage2D()、およびglTexImage3D()にGL_BGRまたはGL_BGRAを指定してさしつかえありません。 OpenGLの前のバージョンでは、この機能はEXT_bgra拡張という形で入手可能であるかもしれません(「フォーマット」 パラメータ としてGL_BGR_EXTとGL_BGRA_EXTを使います)。

11.020  RGBウィンドウにカラーインデックスで描くにはどうしたら良いですか?またはその逆はどうしたら良いですか?

これをするための方法がありません。 しかし、もしそれがアプリケーションを差し込むならば、色インデックスオーバーレイ飛行機でRGBウィンドウを開くことを考慮するでしょう。

もしテクスチャーマップとして使いたい色インデックスの配列を持っているならば、アプリケーションにカラーパレットで色インデックステクスチャーマップを指定させるGL_EXT_paletted_textureを使うことを考慮したいでしょう

11.030  Microsoft Windows で描こうとする時、色がほとんど見つかりません。いったい何が起こっているのでしょうか?

最もありそうな原因は、Windowsディスプレイが256の色に設定されることです。 それを交換するために、デスクトップの右のマウスボタンをクリックして色深さを増大できて、そして、特性と設定タブを選び、カラーパレットの色の数をより高い数に変更します。

11.040  プリミティブに正確な色を指定するにはどうしたら良いですか?

第一に、色の深さを、あなたを緩衝処理すると知っている必要があります するために与えている 。 RGB色バッファのために、以下のコードによってこれらの値を得ることができます:

redBits、greenBits、blueBitsをきらめかせてください;

glGetIntegerv(GL_RED_BITS、&redBits);
glGetIntegerv(GL_GREEN_BITS、&greenBits);
glGetIntegerv(GL_BLUE_BITS、&blueBits);

もし必要な色精度と同じくらい個々のコンポーネントのための深さ値が少なくとも大きいならば、プリミティブのための正確な色を指定できるでしょう。 3つの未契約の整数の最も重要なビットに使いたい色を指定し、色を指定するために、glColor3ui()を使用してください。

もし要求する色を正確に表すように、色バッファが十分に深くないならば、代案戦略が必要でしょう。 個々の色コンポーネントの最下位ビットから離れて釣り合いがとれることは、容認できる選択肢です。 また、個々のパラメータの最も重要なビットに蓄えられた値によって色を指定するために、glColor3ui()(またはglColor3us()など)を使用してください。

いずれにせよ、最終的な色に影響するかもしれないどのような状態でも使用不可にされたことを保証する必要があります。 以下のコードはこれを遂行します:

glDisableです(GL_BLEND);
glDisableです(GL_DITHER);
glDisableです(GL_FOG);
glDisableです(GL_LIGHTING);
glDisableです(GL_TEXTURE_1D);
glDisableです(GL_TEXTURE_2D);
glDisableです(GL_TEXTURE_3D);
glShadeModel(GL_FLAT);

11.050  プリミティブごとに個別の色で描くにはどうしたら良いですか?

色バッファの個々のコンポーネントの深さを知っている必要があります。 先決問題は、これらの値を得るために、コードを含んでいます。 深さはユニークな色値あなたの数をあなたに話します 与えることができる 。 例えば、もし先決問題からコードを使うならば、2^であり、それは、redBits、greenBits、およびblueBits、入手可能なユニークな色の数の色深さを取り出します(redBits+greenBits+blueBits)。

もしこの数が, 問題が全然ない でより大きいならば than 与えたいプリミティブの数 。 個々の色を指定し、個々のパラメータの最も重要なビットの要求された色を蓄えるために、glColor3ui()(またはglColor3us()など)を使用する必要があります。 することができます コード 以下によって個々のプリミティブをユニークな色に表現するループ :

/*
   与えられます: numPrimsは、与えるプリミティブの数です。
   renderPrimitiveな(未契約の長い間)与えられた空所は、プリミティブをするルーチ
   ンです 与えられたパラメータインデックスによって指定した 。
   与えられたGLuint makeMask(閃光)は、指定されたビットの数のためのビットマスク
   を戻します。
 */

GLuint redMask=makeMask(redBits)<<(greenBits + blueBits);
GLuint greenMask=makeMask(greenBits)<< blueBits;
GLuint blueMask=makeMask(blueBits);
int redShift = 32-(redBits+greenBits+blueBits);
int greenShift = 32-(greenBits+blueBits);
int blueShift = 32 - blueBits;
未契約の長いindx;

(indx=0のために; indx<numPrims、indx++){
   glColor3ui(indx&redMask << redShift 、
               indx&greenMask << greenShift 、
               indx&blueMask << blueShift);
   renderPrimitive(indx);
}

また、最終的な色を変更できたどのような状態でも使用不可にすることを確かめてくださいコード断片がこれを遂行するように上で問題を見てください

もしususalの代わりに選択機能を選ぶために、これを使っているならば、後ろのどのような色後で読みでも、色バッファから、その色に表現されたプリミティブのindx価値で容易に変換できるでしょう