fake caustics

by ますお

Beeさんの所でfake causticsの話題が出ていました.そう言えば昔やったなーと思い出したので,書いてみようと思います.

使われたのは”The Matrix Revolutions”で,SmithがNeoのパンチを受け,顔がひしゃげるシーンです.このショットは”Super Punch”と名付けられており,1ショットのフレーム数が多く,フルCGで作成された顔が長い時間アップになる難しいショットでした.

このショットでSmithの顔に散らばっている雨粒が,それぞれcausticsを発生させています.

このフレームのSmithの右頬とか,
super_punch_01

このフレームの左こめかみなどです.
super_punch_02

Matrixではphotonやpath tracing等を用いたGIは一切使われませんでした(ambient occlusionは使われました)ので,このcausticsはfakeです.

mental rayにはshadow shaderと呼ばれるシェーダがあり,シェーディング点から光源への影トレースが行われる時に評価されます.このshadow shaderを使って影の部分にcausticsを生成しています.

当初はこのシェーダは単純に半透明な影を生成するだけだったのですが,どうも嘘っぽく見えて仕方が無かったため,一工夫しました.やっている事は極単純で,基本的には雨粒の面の法線とlight rayとの内積を計算してpow()を取り,更にnoiseをかけた値で光源の光を減衰しているだけです.

ただし,noiseをstaticにしてしまうと雨粒が固まっているように見えてしまうので,noiseをワールド空間で発生させ,noiseのスイミングをわざと発生させて雨粒が動いているように見せています.実際の雨粒は非常にゆっくりとしか動いていないのですが,このnoiseのスイミングによるcausticsの動きで,細かく震えているように見えています.

はっきり言って言われないと気づかないような些細な事なんですが,あると無しでは大きく印象が違いました.CGは,皆が当たり前に感じて気にも留めない事が欠落するだけで,非常に嘘っぽく見えてしまう事があると言う良い例です.

こういう細かい事の積み重ねが,説得力のある絵を作ります.