SSブログ

ポリゴンレンダラ - その5 [プログラミング]

片付け感の強い数学のまとめ。前回は同次座標を使って立体を平面に射影するマトリクスの具体的な形を求めた。

今日はちょっと追加作業をして、面の表示色を求めるためのPhongモデルをおさらい。片付け感は延長する。

3.3  追加作業

これまでで、同次座標を使って(x,y,z)から(u,v)の変換ができたけど、ここでちょっと追加の作業をしておく。作業と言ってもたいしたことではない。

式-23をちょっといじって
0406eq24.png
とする。つまりw=w′/e′の値を残しておく。この値は視点から見たときの奥行き方向の距離を表している。これを使って隠面消去をすればいい、ということである。

3.3.1  隠面消去

隠面消去というのは、面が視点から見て重なっているとき、手前のものが見えて奥のものはそれに隠れる、という現実では当たり前のことを正しく表示するための処理のことである。

さっきの追加計算で、頂点の奥行き方向の値がわかるので、この値でソートして奥から描画するようにすれば自動的に隠面消去ができる。これは普通デプスソート(Depth Sort)といって隠面消去の一番簡単な方法である。

これはポリゴンに交差があったり、複数のポリゴンにサイクリックな前後関係があるときには失敗する。また、よけいな描画が発生するので効率もよくない。

しかし今回はこの方法で隠面消去可能なデータのみを扱う、ということにして、これ以上複雑な処理はしないことにする。

つまり今回は
  • ポリゴン間の交差はない
  • 順序付け不能なポリゴンははじめから分割されている
となっているようなポリゴンの集合だけを対象にする。

3.3.2  デプスソートの問題

式-9で得られるのは頂点の深さ方向の値である。隠面消去はポリゴンに対して行われなければならない。例えば頂点を共有する隣り合ったポリゴンの間で隠面消去が必要な場合が発生する。その場合、それぞれのポリゴンの代表的な頂点(例えば先頭の頂点)の奥行き方向の値だけでは判断できない。

そのときは
  • ポリゴンが持っている頂点の奥行きの平均値、あるいはポリゴンの重心位置の奥行きの値
  • 視点からのベクトルとポリゴンの法線の関係から判断
などということをする必要がある。

4  疑似照明と面の色と反射

照明の問題はけっこう難しい。今回はフォトリアリスティックな表現を作りたいのではなくて、3次元形状の直観的な把握の手助けが目的なので、あまり難しいことはやりたくないけど、やはり直感に訴えるためにはある程度のリアリティは必要である。

難しいことを言い出すと照明光の波長分布と、表面の反射率スペクトルと表面の微細形状に起因する光散乱の角度依存性とそのスペクトルと、あとは目の感度曲線を考慮しないといけない。

目に見える光の現象は物理的にはかなり詳しく解明されているけど、実際にそれを計算するとなるととても大変だ、ということはいえる。物体の運動に関しては「物理演算」がされるようになってきたけど、それはニュートン力学のとば口で、マクスウェルに従った「光の物理演算」はまだまだ大変。イーガンの電脳世界が実現されるのはまだずいぶん先のような気がする。

ということでまたMathematicaとOpenGLのパクリをして、さらにそれを簡単化する。つまり
  • 色はR、G、Bの3色からできている
  • 面の反射光強度はPhongの照明モデルを使う
  • テクスチャマッピングなどはしない
  • フラットシェーディングのみで、シェーディング補間はしない
とする。これで球なんかを表示すると、ポリポリした感じになるけど、それは今回の目的ではかまわない。シェーディングの補間は面倒だし、解像度に依存しないベクタ形式にした場合、補間の間隔をどうするか、というのが問題になる。

4.1  疑似照明

物理的に正しい照明を計算して表示するのはあまりに大変だが、そんなことをしなくてももっともらしい絵を作ることはできる。

まず、人間の目は赤と緑と青の3カ所にそれぞれピークのあるセンサしか持っていない。目はほんのわずかな差を見分けることができるが、波長分布が違っても3つのセンサが受ける強度が同じなら同じ色に見えてしまう。耳は空気振動のFourier解析器になっている(ドとミの音を同時に鳴らすとレに聴こえるなんてことはない)のに、目がそうではないのはちょっと残念。

また、散乱も光学グレーティングのような意図的に微細構造を作ったものでなければ、だいたいの物体の面の凹凸は似たような分布を持っていることが多い。似たような凹凸が似たような散乱特性を示すことは直感的にもわかる。

そういった「ごまかせるところはごまかす」という方針で照明を計算することができる。

4.1.1  色

OpenGLにかぎらず、色はその目の感度に合わせた赤緑青の3つの成分だけで表現されることが多いが、逆に違う波長分布でも同じに見える場合があるということ自身が色の扱いの難しさになっている。今回はそういう難しさを無視して簡単に扱う。

色はRGBの3つの成分からできていてそれぞれが0から1.0までの値を取る、ということにする。RGB全部が0だと黒、全部1だと白を表すということにする。

光源の色と物体の色があって目に見える色はそれぞれの成分の積になる、ということにする。つまり目に見える色を(ER,EG,EB)として、光源の色を(LR,LG,LB)、物体の色を(OR,OG,OB)とすると
0406eq25.png
とする。

4.1.2  反射

今回はPhongのモデルを使うことにする。これは非常に単純化したモデルだけど、OpenGLなんかが使っている。
詳しくはWikipediaの解説なんかを見てもらうほうがわかりやすいんだけど、ようするに面と光源と視点の位置関係によって、見える色の強度が違うということを簡単に計算できるようにしたモデルであって、物理モデルからはかけ離れたものであるが、非常にもっともらしく見える。

ひとつの光源に対して、さっきと同じように目に見える色を(ER,EG,EB)、光源の色を(LR,LG,LB)、物体の色を(OR,OG,OB)とする。
また、図-3
0406fig3.png
のように記号を
光源の位置 l
表面の位置 p
視点の位置 v
pでの法線方向 n
pから見た光源の方向 lplp
pから見た視点の方向 vpvp
pでのlからの光の反射方向 rlp−2 (lp ·n )n
として
0406eq26.png
とする。ただし~aは規格化されていると言う意味で
0406eq27.png
であるとする。

ここで
kd 拡散反射系数(ランバート反射)
ks 鏡面反射係数
α 光沢度
であり、この3つの係数は面の特性として外部から与える。 このほかに環境反射係数としてkaを与えることもある。それぞれの意味はWikipediaなどを参照されたい。ところで光の強度はいくらでもいいけど色は[0,1]の範囲にあると決めたので式-26のkは最大でも1になるように係数の和で割っている。

今回はシェーディング補間を考慮しないので、一つのポリゴンはこの式-26で決まる色で塗りつぶすことになる。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立04/07献立04/08 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。