2009/12/24

Real Time Ambient Occlusion via ICE II

2 comment
リアクション: 
メリークリスマスイブっ!

すごいひさしぶりにICEをいじってみました。

以前、WeightMapにしか適用でき無かったAOですが、VertexColorに再現出来る方法が分かったのでやってみました。

こちらの方のサイトを参考にしました。
http://coralocean.sakura.ne.jp/2008/09/20080901020653757

こちらがICE Tree。



では、つたない解説。



まず、初めに、ポイントごとに必要なランダムベクトルを作るために配列を用意します。
0~1までの、配列を作れるとわかりやすくていいかもです。
5個の配列なら

[ 0, 0.25, 0.5, 0.75, 1 ]

って感じ。
一番左端のIntegerノードがランダムベクトルの数になります。
この数字を増やせば増やすほど高精細な結果になるけど、重くなるってところです。



次は、キレイにならんでいる配列にランダム感を与えます。

ランダムノードは、一律に同じ値が入ってしまうので、使えません。
なので、Modulo(剰余)を使ってちょっと細工をします。
入ってきた配列に対して、適当な値を掛け算します。この値は、整数では駄目です。

123.4818

などのような値が好ましいようです。1でModuloするので少数が入ってりゃいいです。
欲しいのは、半球のランダムベクトルなので、XとZだけ、レンジを-1~1にします。
Yは、0~1までです。

最後に、Point毎にNormalの方向にProject Vectorを使ってランダムベクトルを向けます。



Scalar to 3D Vector をプレビューすると、こんなベクトルの花が咲きました。



次は、このベクトルフラワーをPointごとに配置して、このベクトルが、自分自身に突き刺さるかを判定するのに、Raycastを使います。遮蔽率を求めるためです。
PointPositionに、PointNormalをちょっと加えているのは、フラワーをサーフェイスから少し浮かすためです。
でないと、まったいらな平面でも遮蔽してしまうことになってしまうからです。
Dirtmapは実はそこが弱点だったりしますが・・・。



ベクトルがヒットしたか否かの配列の平均を取ることで、そのPointの遮蔽率を出します。
Gradientノードに一度さして、PointColorに焼き込みます。
その後、改めてVertexColorにさします。
直接させないのが、なんで?って感じなんですけど・・・。
教えて欲しいものです。

以上でざーっとですが、ICE Treeの解説でした。

もっといろいろやりたいんですが、いかんせんアルゴリズムが分かりません。
数学Iしかやってないのが、ここに来て響いたなぁ(笑)

ま、自業自得ですねー。もっと勉強します。

そして、ワタクシ、来年より無職になります。
半年くらい仕事しない予定。
だけど、ブログはちまちまやっていこうかなと思ってます。

では、早いですが良いお年をお過ごしください。

来年も良い年でありますように。