トップ
ソフトウェア
陶芸
陶芸
OpenGL
大戦略1208攻略
リンク
5 ポリゴンの設定
OpenGLでは、ポリゴンの描画が全てであるといっても過言ではない。ここではコマンドやコードを記述する前に、ポリゴンに対してどのような設定ができるのか主なものを解説する。蛇足になるが、OpenGLには、三角形以外のポリゴンが実は存在しない。Polygonコマンドなどで描いた四角形以上の多角形は、実は内部的に全て三角形ポリゴンの集合体として扱われている。
なお、
水色の項目は最初に全体で内容を設定、薄緑の項目はポリゴンごとに設定することになる。
ポリゴンの裏表
OpenGLのポリゴンには、裏表が存在する。(法線ベクトルは陰影用で、ここで言う裏表とは別)。この表裏は、ポリゴン構成点の描画順番によってのみ決まる。視点から見て、反時計周りのとき表、逆のとき裏となる。
裏表は、表だけ表示、裏だけ表示など、ポリゴンの表示を設定ができる。この機能は実はよく使われる。例えば立方体オブジェクトの場合、全ての面が、その面の方向に視点があるとき表となるように作ってあれば、裏になったときは、他の面の陰になって、描画する必要がないはずである。立方体でなくても、同様のルールで作った閉じた立体では、裏面は表示する必要がない。そう決定しておけば、ポリゴンの描画優先順位の計算が非常に軽くなるので、処理が速くなるのである。
詳細解説へ
ポリゴンの深さ(重なりの計算)
OpenGLでは、ポリゴンの深さ(Depth)設定を有効にすることで、自動的にポリゴンを描く順番を決定し、遠いものほど隠れるようになる(実際は、重なる部分はポリゴンを分解し、遠くにあるものは描画しないようにしている)。Depth設定を無効にすると、コマンドを実行した順で描画する。
ポリゴンのスムージング
ここまでのサンプルで気づいた人もいると思うが、ポリゴンの縁はギザギザした感じに見える。CGではピクセルに対して画像が小さいと必ずギザギザになる。通常、これらを滑らかに見せるときは「アンチエイリアス」という技術を使い、境界線を中間色で補間し、ぼかした感じにして分からないようにする。OpenGLでもアンチエイリアスをかける設定が存在するが(線とポリゴンは別々に設定できる)、以下の理由により、線のみの描画以外、実用的とはいえない。
・隣り合ったポリゴンの境目にもアンチエイリアスがかかり、連続した面に見えない。
・多角形ポリゴンを内部的に分解した三角形ポリゴンの境目もアンチエイリアスがかかり、余分な線が入る。

このことから、OpenGL単体ではポリゴンはギザなしにできないと考えたほうがよいと思われる。また、スムージングを有効にすると、描画速度が極端に低下する。
下のサンプルは、上段がスムージングなし、下段があり。また、左二つはcolorコマンドで色付けしたもの、右は下で解説している材質、光反射での着色である。どれも境界のきれいさに差があるが、よく見ると赤以外で
下段の角から下に向かって線が入っているのが分かる。これがここで述べている三角形ポリゴンの境目である。
なし:color 単色 なし:color 2色 なし:ライト
あり:color 単色 あり:color 2色 あり:ライト
ポリゴンの法線ベクトル
ポリゴンが陰影を作るには、材質以外に面の方向を表す法線ベクトルを設定する必要がある(先に述べた裏表ではない)。法線ベクトルとは、高校の数学で習うと思うが、空間にある面に垂直なベクトルである。長さは基本的に1となるようにする。このベクトルと光線のベクトルと材質でポリゴンの発色は計算される。色が構成点ごとに設定できたのと同様に、法線ベクトルも構成点ごとに設定することができる。この技法を使うと、平面で構成された立体が、より曲面のように見える。なお、法線を求める関数はOpenGLには存在しないので、各自求めることになる。
p1からp2へのベクトルをA、p2からp3へのベクトルをBとするとき、法線ベクトルnは、数学記号を使って記述すると

 n = A x B =( ay・bz-az・by , az・bx-ax・bz , ax・by-ay・bx )

となる。ABの順番を逆にすると、裏面方向の法線ベクトルとなるので注意。実際に使うときは、さらにベクトルの長さで各成分を割り、長さを1にする。
ポリゴンの材質・色
ポリゴンに色をつけるコードは「とりあえず表示しよう」で述べたが、そちらの設定はポリゴン自体が発光しているようなものといえる。つまり、角度が変わっても、陰影がまったく変わらないのである。これだと、せっかく3Dで描画してもリアリティがない。ここで設定する材質や色は、別途設定した光源からの光に対して、どのような反射をするかで設定される。よって、複数のポリゴンに同じ材質・色を設定しても、角度によってリアリティのある陰影が作られる。材質を表現するために、あたる光への反射係数の種類だけでも環境光、拡散光、反射光があり(発散光は発光のため、ここでは除く)、さらに色別の設定がある。この他に光源も同様の設定や位置の設定もあり、きっちりやろうとすると、それなりの理解力と労力が必要だが、得られる画像は全く別物といえる。実際、光源等の設定でできる画像を自分で計算したら、とんでもないことになる。右のサンプルでは、光源一つと法線ベクトル二つで陰影がついている。
テクスチャマッピング
今時、3Dグラフィックスをするとなると、テクスチャマッピングを知らない人はおそらくいないだろうと思うし、これを扱えることがOpenGLを一応使えるようになったと思えるラインではないだろうか。テクスチャマッピングでは、ポリゴンに別で用意した画像を貼り付け、少ないポリゴンでより複雑な表現をおこなうための技術である。テクスチャは、前述の材質や色の影響が上乗せされるので、両方の設定をうまくつかいこなすことで、より高品質な画像に仕上げることができる。
左の例では、テクスチャは白地に「てくすちゃTEST」と書いたもので、これを黄色い材質に貼り付けている。
OpenGLでの光の種類と反射の仕方
OpenGLでライトを使っての表現は厳密な計算で実際の光と同じ場面を再現せず、擬似的に再現している。そのために用意されているのが、環境光、拡散光、反射光がある(発散光は発光のため、ここでは除く)私はこの反射光という表現はどうかと思う。なぜなら、他の2光も反射した光であり、鏡面反射光とするのが正しいはずである。もし略すなら、鏡面光のほうが混乱しないはずである。よって、ここでは、鏡面反射光と書いていく。。それぞれの光は以下のような特徴がある。それぞれの違いは、反射の経路から外れたときの減光の仕方に違いがあるだけと思ってよい。下の図は、真上から白色光が水色の多角形に当たり、左のカメラで受光するときのサンプルである。45度の角度の面に当たった光はどれも同じ大きさでカメラに入るが、面が上を向けば向くほど、環境光以外は光が弱くなり、暗くなる。
この点での色は、3つ全ての結果の合計で決まる。どのような値に設定すれば希望の結果になるかは慣れが必要なので、いろいろ試してみるとよい。なお、これらの設定は、光源、材質両方でおこなう。
定数 OpenGLでの特徴
反射光
GL_SPECULAR 反射面で鏡のような反射をする光。反射の経路から外れると、極端に明るさが低下する。球の一部が白く強く反射している部分の再現などに使う。SHININESSで反射強度の設定ができる。
拡散光 GL_DIFFUSE 反射面で適度に散乱する光。反射の経路から外れると、徐々に明るさが低下する。球が縁に向かってだんだん暗くなる部分の再現などに使う。一番メインで使う光。
環境光 GL_AMBIENT 反射面で、全ての方向に均等に散乱する光。法線に関係なく、どの位置から見ても同じ色になる。物体の輪郭を作るためなどに使う。値を大きくすると、のっぺりした感じになる。
鏡面反射光 拡散光
右の角度が異なる面を持つ物体に光が
上から当たったときの反射のイメージ。
環境光はどの角度でも同じ強さが返り
逆に反射光は反射角からずれると、一気に
強さが変わる。
環境光
前へ 次へ
  
Copyright Lichu since 2008 all rights reserved