« MGS3日記(3) | メイン | MGS3日記(4) »
2004年12月21日
True DOF [ CINEMA 4D R9 ]
CINEMA4DのDOF(被写界深度)はZ深度を使ったポストイフェクトなので、処理は高速だが、ボケに透明や反射を反映しない。これはPhotoshopCSのレンズぼかし等、2D処理ソフトの被写界深度フィルタと同様。
一方、Brazil r/s、VRay、finalRender、Mental Ray等、モダンなレンダラは分散レイトレーシングによるDOFが使えるようになっていて、処理に時間はかかるが、透明・反射を反映した正確なボケが得られる。つうかShadeのいちばん安いやつですら分散レイトレの被写界深度が使えるっていうのに、CINEMA4Dについてないってのはどういうことだ!
と憤慨しておきつつ、実はそのへんはチカラワザでどうにかなるもので、ちゃんと透明・反射を反映したDOFは可能。まず実例を。
まず、これ↑がDOFなしの画像とZ深度(Depthチャンネル)。
で、こっち↓が特殊効果のDOFと、チカラワザの本物DOFの比較。
特殊効果のほうは透明なガラス越しの部分が全くボケていないので使い物にならない。よく見ると、映り込んでいる空のボケ具合にも差がある。
で、チカラワザの本物DOFの原理はというと、カメラを焦点を中心にブレさせてシーンモーションブラーをかけるというもの。チュートリアルが公開されている。
Parenders.com Tutorial::True Depth of Field
かなり込み入ったXpressoを使っていて、数学的なことになると僕にはさっぱりわからなかったけど、とりあえずちゃんと動いた。
で、このXpressoベースのやつをCOFFEEエクスプレッションで作り直した人がいた。
CGTalk - mdme_sadie's True DOF - COFFEE version
こっちはC4Dファイルが配付されていないので自分でこのCOFFEEのソースをコピペしなきゃいけない。説明によるとアニメーションに対応できるよう改良してあるとのこと。こっちもCOFFEEの中身はさっぱりわからないんだけど、オブジェクトの構成は本家のXpresso版よりシンプルで、設定はパラメータを2つ書き換えるだけなので、使い勝手としては本家のXpresso版よりこっちのCOFFEE版のほうが良いと思う。
囲んである2行が設定するパラメータ。上の「radius」はボケの大きさで、ボケさせるためにカメラをブレさせる範囲。数値は試行錯誤して決める。下の「strength」はシーンモーションブラーで設定してあるボケの強度を入力するところで、%を実数に直して入れる。
オブジェクト構成は下図のようになる。カメラと同位置に親のヌルオブジェクト(Camera_holder)を置き、両方にターゲットエクスプレッションをつけて、ターゲットは同じヌルを使用。カメラを移動するときは親のヌルを動かす。

カメラをアニメーションさせる場合、3つのエクスプレッションを、1=親ヌルのターゲット、2=DOFのCOFFEE、3=カメラのターゲット、の順で実行しなくてはならないので、エクスプレッションの優先順位をいじる必要がある。デフォルトではターゲットエクスプレッションは「10」、COFFEEエクスプレッションは「0」になってるはずなので、たとえばカメラの親ヌルのターゲットエクスプレッションを「-1」まで上げておく等して、優先順位を変更する。
で、実用上、この「チカラワザ本物DOF」はどうかというと、まあまあですな。特殊効果のDOFに比べれば速度は当然遅いわけだけど、どうしても透明・反射のあるシーンでDOFが必要なら、他に選択肢がない。
速度からいうと、シーンモーションブラーを使ってるので、レンダリング時間がサンプル数だけ延びることになり、ことによると25倍になってしまう。まあラジオシティを使ってる場合は計算結果をキャッシュしておくことでかなり短縮できるので、実用にならないほど遅くはない。
ハイライトのブルーム(光点がカメラの絞りの形に膨張する効果)も出せないけど、ハイライトだけ特殊効果のほうで出して上にのっければいいんじゃないだろうか。
あと、最大サンプル数が25までしかないので、ものすごくボケてる絵を高解像度で出そうとすると無理があるかもしれない。
最初に挙げたモダンなレンダラ群はおそらく、DOFの分散レイトレーシングの際に、ボケの大小やコントラストの程度によってサンプル数を最適化して時間を短縮しているはず。ハイライトのブルームも可能だろうし。CINEMA4Dもそろそろ年貢の納め時だろう。次バージョンで、分散レイトレーシングのDOFやモーションブラーを実装してもらわないと困りますよマジで〜。
投稿者 ヒロツ : 2004年12月21日 03:25
トラックバック
このエントリーのトラックバックURL:
http://kowloo.net/hirotsu/mt/mt-tb.cgi/69
コメント
Parenders.comに被写界深度の記事があったのは知っていたんですが、Coffee版は思ったより簡単に使えるんですね。
ところで他社のモダンなレンダラーは、分散レイトレでハイライトのブルームを出してるんですか?ものすごいサンプル数でしかも16bitでレンダリングしないと出しようがないから、みんなフェイクかと思ってました。
C4D的には反射面のZ値を計算してフェイクの被写界深度計算、透過面のZ値を計算してフェイクの被写界深度計算、…というのをレンダリングの際に自動合成でやってほしいなあ。
投稿者 kuro : 2004年12月21日 20:32
えっと、レンダリング結果は普通、
内部的には96bitだかそのぐらいで持ってるので、
それを24bitに丸める前の状態を保持したまま
サブフレーム(あるいは分散レイトレのサンプル)を
合算すると光学的に正しいブルームが起きるはず。
>>ものすごいサンプル数で
まえ某社のBrazil r/sでGI+DOFのシーンをやったとき、
1200pixの画像がXeon2.8*2で60時間ぐらいかかったので、
実際ものすごいサンプル数なんではないかと。
Brazilの場合はGI自体も遅いからなんともいえないけど。
上のTrue DOFは25倍コースだけど、P4 2.4で10分ぐらいです。
VRayだとDOFもモーションブラーも分散レイトレなので、
ボケたハイライトだけじゃなくモーションブラーの軌跡でも
ブルームが起きてますね。
VRayのDOF
http://www.vrayrender.com/gallery/image/155/
VRayのモーションブラー
http://www.vrayrender.com/gallery/image/158/
ブルームを絞りの形(5角形とか)にするには、
DOFのサンプルをぶれさせる範囲をその形にすればいいわけで。
CINEMA4Dでも、上記のTrueDOFをやるときに
1)シーン全体の輝度を下げてレンダリング
2)16bitPSDで書き出し
3)Photoshop上でレベル補正してハイライトを生成
ってやればブルームは起きるんじゃないかと。
気が向いたら後でテストしてみます。
フェイクのDOFの場合、いくら賢くやっても
手前のオブジェクトに隠されてる裏の部分のサンプルがないから、
派手にぼかしたときのエッジのにじみは避けられないし、
透過像が屈折してたり反射面が曲面だったりするとお手上げなので、
そのへん中途半端じゃないかな〜。
これなんか、どうなんだろう。
X-Dof
http://www.evasion3d.com/xd_mr_prodinfo.html
mental rayとの比較(チェスのやつ)によると、
mental rayはDOFでブルーム起きてないですね。
24bitに丸めてから合算しちゃってんのかな。
Shadeの分散レイトレもそうみたいだけど。
これによると
http://www.evasion3d.com/gfx/xdof/mr/gallery/domino1.html
「sampling passes 9」ってあるから、
X-Dofは分散レイトレじゃなくてサブフレーム合成+イメージブラーで
DOFをかけることもできるのかも。
投稿者 ヒロツ : 2004年12月21日 21:39
>えっと、レンダリング結果は普通、
>内部的には96bitだかそのぐらいで持ってるので、
あ、確かにそのとおりですね。
分散レイトレの合成(?)の時に丸めなければいいのか。
>ブルームを絞りの形(5角形とか)にするには、
>DOFのサンプルをぶれさせる範囲をその形にすればいいわけで。
なるほど、その手がありますねえ。
他のレンダラーはそこまでやっているのかなあ。
マクスウェルなんかは絞り付きカメラをシュミレートしてるそうですね。
http://www.maxwellrender.com/
>フェイクのDOFの場合、いくら賢くやっても
>手前のオブジェクトに隠されてる裏の部分のサンプルがないから、
そうなんですよねー。
ただ、透過物と入っても、現実的なシーンでは、平面のガラスがほとんどだったりするので、平面だけに限定すればものすごく高速化できるオプションもつけれるんじゃないかなあ…って、かえって使いにくいレンダラーになりそう(笑)
投稿者 kuro : 2004年12月22日 00:11
maxwellはベタなパストレを延々やってるだけっぽいけど、
どうなんだろう?
レイを飛ばすときにカメラの物理特性をいちいち全部反映させれば
たしかに正確な結果が得られるとは思うんだけど、
それって今のPCの速度で実用になるんかな……。
あと、RGBじゃなくスペクトルで計算してるとか書いてあるねえ。
輝度が飽和する途中で色が化けるやつ(茶色>黄色>白みたいな)のが避けられたりするんだろうか。
>>平面のガラスがほとんどだったりするので、平面だけに限定すれば
ガラスありとガラスなしの両方をレンダリングして
マルチパスの屈折チャンネルを差し替えればいいような気も。
ボケを計算するのにデプスで一枚絵をぼかすんでなく、
反射や屈折の各パスごとにカメラからの距離を計算してぼかして、
それを合成して最終の絵を出してくるようなのを作れば
わりと正確なDOFが得られると思うんだけど、
そんなことするぐらいなら分散レイトレやったほうが早そう。
8bitに丸める前のデータをパスごとに全部保持してイフェクトかけるとすると
ものすごいメモリ食うだろうし。
投稿者 ヒロツ : 2004年12月22日 01:34