Dirtmap shader in lucille

by syoyo

某プロダクションの方から、こんなシェーダがあるよと教えてもらいました.

http://animus.brinkster.net/index.html

MR 向けの Dirmap シェーダです(汚しシェーダ).
Ambient Occlusion っぽいシェーディングをします.

ソースもあるので、中身を見てみました.

Dirmap はいろいろとパラメータの設定に応じて動作が変わるようですが、
その中でも最も AO の動作に近い probe geom がオンのときの動作について取り上げます.

やっていることは基本的には ambient occlusion と変わりないですね.
ただ、シェーディング点から半球上にレイを飛ばしたときに遠くにヒットした場合は遮蔽されていないと見なしたり、
法線を曲げたりなど、シェーディングの処理をいくらかいじれるようになっていてコントロールしやすくなっています.

で、 lucille でも早速実装してみました.

dirtmap_lucille.png
(dirtmap. 遮蔽効果を近傍に限っているので、上の板からの遮蔽の影響はない)

ao_lucille.png
(AO. 上の板からの遮蔽も正しく考慮)

ちなみに、lucille も、MR みたいに API で独自レンダラや独自シェーダを書けるような枠組みに大体なっています.

lucille の API の構成も(ちょっと真似た部分もありますが)だいたい MR と似ているので、
MR ユーザにとってもスイッチしやすいようになっています.
(将来的には大域照明言語とか作って, C/C++ で書かなくても済むようにするつもりですが)

Dirtmap の利点

ここで、Dirtmap の利点について考えてみました.

ひとつは処理が AO に比べて結構早いということ.
これはシェーディングするときに周りとの物体からの遮蔽をチェックするためのサンプル数が、
AO にくらべて少なくて済むということによります.

とくにレイが遠方の物体にヒットする場合は固定色(今回は白)で置き換えてしまうのですが、
これが結果的にシェーディング色の分散(=ノイズ)を減らすという方向に働いています.

レイが近くの物体との交点が見つからず、遠くをチェックしなければならなくなるほど、
ヒットするかヒットしないかがあやふや(確率の分散が増える)になるため、
レンダリング結果にノイズが出やすくなるのですが、それが dirtmap では無くなるためです.

結果として、AO と同じ品質(ノイズのなさ)を、少ないサンプル数(処理時間)で実現できています.

もちろん、AO でも、レイの交点探索をある程度までにクランプするという風にすれば dirtmap と同じ働きになります.
実際の商用レンダラでも、AO にそのようなパラメータが付いていることもあるようです.

もうひとつは、look のコントロールがしやすいこと.
実制作現場では、場合によってはシェーディング効果は局所的なほうがうれしかったりするときがあります.
キャラクターのまわりにデカイ物体があって陰影の影響をキャラクタに与えたり、
上記の絵のように上側の板が下にある物体に影響を与えたりするのはあまり望まれなかったりします.

まとめ

そんなわけで、高速に AO 的な効果が得られ(テクスチャ貼ればだいたい AO の結果と変わらなかったりする)、
それでいてコントロールしやすいということで、
dirtmap、というかより一般的には AO に距離でクランプを入れる手法、以外といいかもしれません.
(そういやもともと AO が有名になった SIGGRAPH 2002 course note でも距離でクランプは取り上げられていたような気がする)

ちなみに、dirtmap のような効果をレイトレを用いずに高速に実現する手法はすでにいくつか提案されていたりします.
SSAO とか、Okan Arikan による近場だけジオメトリベースで処理するという方法などですね
(pixie にはこの手法が実装されているはずです).

Advertisements