~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  OpenGL 入門講座    「三次元グラフィックスの基礎とOpenGL関数の全体像を掴む」 第1-4回 「3D-CG基礎、ポリゴン表示、ワイヤー表示」用のプログラム ----- カラーについて ----- ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ しばらく、休息しておりましたが、入門講座の続きです。 今回は、カラーについて説明をします。 (OpenGL には、インデックス・カラーと RGBA カラーの 2 つのカラー表示 モードがありますが、今回は、RGBA カラーモードのみの説明を行います。) ■ カラー:  光の三原色のことは、ご存じでしょうか。光の三原色である赤、緑、青を  加色混合すると、色々な色を表現することができます。   赤 + 緑 -> 黄   赤 + 青 -> 紫 赤 + 緑 + 青 -> 白 など。  三次元コンピュータ・グラフィックスでも、一般に色を R, G, B の三色で  指定します。もちろん OpenGL も例外ではありません。  OpenGL では、通常 R, G, B を 0.0 から 1.0 の範囲で指定します。値が  大きいほど明るく、小さいほど暗くなります。 また、R, G, B だけではなく、A を含めて色を指定することもあります。 この場合も、A は 0.0 から 1.0 の範囲で指定しますが、今は説明を省略 します。 ■ カラー・バッファ:  OpenGL では、R, G, B を 0.0 から 1.0 の範囲で指定しますが、カラー  バッファには、0 から 2^bit-1 の範囲で保存されます。  例えば、R,G が 各 3bit、B が 2bit(合計8bit) の場合は、   R(3bit) ... 0 から 2^3-1 = 7 の 8 階調 G(3bit) ... 0 から 2^3-1 = 7 の 8 階調  B(2bit) ... 0 から 2^2-1 = 3 の 4 階調  -------------------------------------- 8x8x4=256色  となります。  また、R,G,B が 各 8bit(計24bit) の場合は、   R(8bit) ... 0 から 2^8-1 = 255 の 256 階調 G(8bit) ... 0 から 2^8-1 = 255 の 256 階調  B(8bit) ... 0 から 2^8-1 = 255 の 256 階調  ------------------------------------------ 256x256x256=1670万色  となります。なお、1670万色をフルカラーと呼ぶことがあります。 現在では、多くのワークステーションで、256色表示が可能です。IRIS や HP 等の GWS では、24bitフルカラー表示が可能なものも多くあります。 Onyx RE2 等のハイエンドのマシンでは、48bit(RGBA各12bit) というもの もあります。 フルカラー表示が可能なワークステーションは、まだまだ高価ですが、最 近はパソコンでも、解像度は低いもののフルカラー表示が可能となってい ます。 美しいグラフィックスを表示するには、やはり24bitは欲しいものです。 256色等、カラーバッファのビット数の少ないハードウェアであっても、疑 似的に多くの色を表現するために、OpenGL ではディザ機能があります。 ディザに関しては、また機会があれば説明したいと思います。 なお、findvis の資料に、OpenGL のカラーバッファに関する情報もありま すので、ご利用ください。 □ 背景色  OpenGL で、背景色を指定する関数は、glClearColor() です。  RGBA の値を指定してください。glClear() でカラーバッファを消去した際  に、glClearColor() で指定した色で消去されます。 program1_1.c では、bg[] で背景色を指定しています。R = 0.2, G = 0.5, B = 0.8 ですので、青色であることが分かります。  □ ワイヤー、ポリゴンの色 ワイヤー、ポリゴンの色を RGB モードで指定する関数群は、glColor*() です。 glColor*() は、glColor3f() や glColor4fv() などいくつかの関数 をまとめた表現です。(* には、接尾子が付きます。) glColor3f(float r, float g, float b) glColor4f(float r, float g, float b, float a) glColor3fv(float *rgb) glColor4fv(float *rgba)       :        :  このように、最初の接尾子が 3 のものが、RGB の値を指定するもので、 4 が、RGB に加えて A も指定するものです。 2 番目の接尾子は、引数の型を指定するものです。f は float であり、d は、double を表します。 3 番目の接尾子 v が付いているものは、配列のポインタで指定するもので す。 ワイヤーやポリゴンは、glColor*() 関数で指定した色で表示されます。 色の設定は、ポリゴン単位で行う必要はなく、再度、glColor*() 関数でカ レントカラーを変更するまで、同じ色でポリゴン等を描画します。 program1_1.c では、軸の色と、箱の色を red[], blue[], green[] で指定 しています。 ■ 自由課題:   1. 背景色を変えてください。   2. 箱の色を変えてください。   今回のプログラムを一部手直しすれば、簡単にできますので、一度やって   みてください。 ■ 用語解説: ○ ディザ 少ない階調の出力装置に、より多い階調の画像を出す場合に用いる手法 です。この手法を用いることで、マッハバンドを和らげることができま す。 ○ マッハバンド 色が滑らかに変化するものを、階調の低い出力装置に出した場合、色調 が滑らかに変化せず、帯状に輪郭が発生します。この効果をマッハバン ドといいます。 ■ 次回予告:  第1-5回では、ポリライン、ポリゴンの表示について説明を行う予定です。 ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -- 寺西 忠勝