PRManとmentalrayのマイクロポリゴン
twitterで話題になっていたので,まとめようと思います. この話は突き詰めると,Reyesとレイトレという根本的なレンダリングアルゴリズムの違いに帰着するのですが,まあここではPRManとmentalrayという事にしておきます.あと,最初に言っておくとV-Rayやその他最近のレイトレレンダラは色々と進歩していて,ここで書いている事は必ずしも正しくない場合もあると思いますが,基礎してとらえて下さい. マイクロポリゴンというのは,何か特別なポリゴンを指す訳ではなく,そのサイズが大まかにピクセルと同じかそれよりも小さいサイズの物をそう呼ぶ事が多いようです.そういう意味では,PRManとmentalrayのそれは違いがありません.強いて言えば,PRManのマイクロポリゴンはquad,mentalrayのはtriangleという事くらいです. さて,ではどこに大きな違いがあるのかというと,まずその生成のされ方に違いがあります. PRManはbucket毎に処理を行い,NURBSでもポリゴンでも,全ての種類のジオメトリをbucketのサイズに近いサイズまで一度分割します.これをsplit processと呼びます.その後,スクリーンに入っているかどうかの判定をして,もし入っているようなら,今度はsplitされたジオメトリを更にマイクロポリゴンまで分割します.これをdice processと呼びます. この時点ではまだ各マイクロポリゴンはバラバラではなく,メッシュ状態を保っていて,マイクログリッドと呼ばれる事もあります.なぜメッシュである必要があるのかというと,PRManではこの後にDisplacement shaderが実行され,各マイクロポリゴンの頂点が移動する可能性があるからです.メッシュでなければ,動かした所が割れてしまいます. 次に各マイクロポリゴン毎にSurface shaderを実行し,シェーディングします.PRManのマイクロポリゴンはシェーディングされるジオメトリの最小単位です.一つのマイクロポリゴンは一色にflat shadingされます.この後にメッシュはバラバラにされ,各マイクロポリゴンの前後判定と,どのピクセルに含まれるかを調べます.これが1 bucket毎に起こる処理の(大まかな)内容です. 一方,mentalrayは(scanlineモードもあったりしますが)基本レイトレーサですから,ポリゴン分割はレイとの交差判定が起こる前に終わっている必要があります.そして,その分割処理はオブジェクト単位で行われます.PRManのようにbucket毎に分割はしません.しかし,最近のmentalrayには分割処理の方法にfine approximationというモードがあり,PRMan「みたいな」処理をします.つまり,元のジオメトリをある程度の大きさに分割(PRManでいうsplit)し,更にそのサブジオメトリを再分割します(同 dicing).この場合,サブジオメトリは個別のbounding boxを持つので,レイが交差判定しようと試みたサブジオメトリだけを再分割すればよく,オブジェクト全体を割るよりは効率的になります.結果,分割数を上げる事ができるので,fineなディティールも出せるというわけですね. 分割の後,Displacement shaderが実行されるのはPRManと同じですが,Surface shaderは各ポリゴン毎に実行されるわけではなく,純粋にカメラレイが当たった交点で実行されます(実はこの違いはReyesとレイトレのそれぞれを象徴する重要な要素なのですが,その話はそれだけで長くなりそうなので,またいずれ). 余談ですが,mentalrayには他にも,面のcurvatureを基準にしたり,視線との角度を基準にしたりと様々な分割モードがあって,ユーザがその場に応じて使い分けられるようになっています.設定次第ではピクセルサイズまで分割する事もできます.ただ,adaptiveな分割はうまく動かないケースが結構あったりして頻繁に変更しなければならないし,一番の問題はアニメーションの途中で分割のされ方が変わってしまうため,フレーム毎にシェーディングの結果が違う場合があるのです.これが理由で自分はadaptiveな分割はほとんど使った事がありません. さて,一次レイ(カメラレイ)に関してはこんな感じなのですが,二次レイ(反射や屈折,GIレイなど)になるとまた色々と面倒な話になります. PRMan方式は基本的にレイトレと相性がよくありません.カメラからのレンダに関してはピクセルという明確な区分領域があるのでうまく動くのですが,レイは数学的に「線」ですから,領域がありません.つまり,ピクセルのサイズという大前提が崩れるのです.bucket毎に処理単位を分ける事もできません.今でこそPRManでも普通にレイトレが使えますが,マイクロポリゴンをそのままトレースする訳にもゆかず,様々なhackでどうにか形にしている感じです. これは予想ですが,PRManでは二次レイが当たったジオメトリはピクセルサイズまでは分割していないと思います.もっと荒いはずです.これはテクスチャを張ったオブジェクトを鏡に映してみるとわかります.結構像がボケます.以前は二次レイから見たジオメトリの大きさを推量するためにconeを使っていると聞きましたが,今ならray differentials的な何かを使っているのではないでしょうか. この点,mentalrayは基本がレイトレーサですから,別に二次レイが飛ぼうがなんだろうか,基本的には何も変わりありません.せいぜい,たくさんのレイがオブジェクトに当たりまくって,大量のポリゴンを保持するために多くのメモリを必要とするくらいです.メモリが必要なのはPRManも同じですからね. と言うことで,一口にマイクロポリゴンと言ってもその使われ方には大きな違いがあります.displacementのディティールという意味ではあまり違いがないように感じるかもしれませんが,ディティールの善し悪しは分割数だけではなく,ジオメトリをどのようにサンプルするかが非常に重要なので,ポリゴンのサイズだけでは語れません.今のところ,displacementのディティールはmentalrayでピクセルサイズまで割っても,まだPRManに分があるように思います. このテの話は色んな方面からツッコミが来そうで怖いのですが,とりあえずこれにて.