[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」
 「CORAL」というプロジェクトがある。これはフラクタル立体図形を描いて,VRで楽しもうというのが趣旨のものだと思っていいだろう。
 フラクタルのすべてが珊瑚のように見えるわけではないが,マンデルブロ集合などの特徴的な形状が珊瑚礁のような雰囲気なのでこの名称が付けられているようだ。

 ということで,2018年3月20日,Game Developers Conference 2018では,「Cone Marching in VR: Developing a Fractal Experience at 90fps」というタイトルでそのCORALを扱ったセッションが行われた。


 フラクタルというのは,自己相似型の構造を示す数式で描かれるものであり,しかも際限なく計算できる。たいていの場合は縮尺をいろいろ変えてこそ意味があるものなので,一定の形状を前提にしたポリゴンで扱われることはあまりない。ボクセルレンダリングやレイトレーシングで扱われることの多い題材である。CORALでは,Cone Marchingが使われているという。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 フラクタルの内部を動き回るには,座標と倍率を指定する必要がある。フライバイのアニメーション形式なので,速度,角速度も指定する必要がある。なお,倍率が高くなるほど,レンダリング負荷は上がるという。
 レンダリングする際に,フラクタル図形は,SDF(Sined Dinstance Fieled)に切り取られるのだが,そもそものフラクタル図形(ここではマンデルブロ集合)の立体表示などについても一通り説明されたが,基本的にはDaniel White氏とPaul Nylander氏による式をそのまま使っている。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」
[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 Cone Marchingは,コーン(円錐)がマーチング(前進)していく方式である。レイマーチングのコーン版ともいえる。
 これがVRで90fpsをキープしてレンダリングされるのだ。Cone Tracng自体もリアルタイムで処理するには決して軽いものではない。かつてUnreal Engine 4が目指しつつもなしえなかった処理である。CORALで実際にどのようなことが行われているのかがセッションで紹介された。

 レイ(コーン)を少しずつ飛ばしていたのでは無駄が多いとのことで,光源に当たる点から,周りのどこにも接触しない半径の球を割り出しておくとその半径の距離までは一気に飛ばせるという。交点を見つけるのにあれこれやってるのに接触半径はなぜか簡単に分かるらしい? (うむ分からん)

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」 [GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 このSphere Tracingを前提として,Cone Marchingの説明になるのだが,円錐内で解像度を変えて同じシーンを徐々にレンダリングしていく。交差がないと保証されるまで,コーン内の角度を分割してSphere Tracingを繰り返すのだ。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」 [GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 Cone Marchingの負荷などを示したのが,次のスライドだ。パスごとに55〜150ステップかかっており,これを左右の目でそれぞれやらなければならない。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 ここで,左右の目でそれぞれやる必要があるのだろうかという問題定義がなされた。今回のCORALでは,右目と左目の間に真ん中の目というのを想定して,基本的な計算はそこで行い,でてきた結果を左右の目の位置にずらす(リプロジェクションする)という方法が取られている。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」 [GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 これは過去に論文をもとしているそうだが,そこでは,左右の目の視差に相当する部分(真ん中の目からは見えない部分)に隙間が空いてしまうという問題があった。その隙間部分は別途処理することで埋めるというのが今回のCORALで採用されている方法だ。
 それってアリなのかと思ったのだが,別のNVIDIAのセッションでも片目分のレンダリング結果をリプロジェクションする話が出ていた。隙間をちゃんと埋めれば問題ないものらしい。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」

 とにかくこれにより,一番重いCone Marchingの部分を1回で済ませることができる。
 しかし,これでもまだ重い。そこで,画面の中心部はフル解像度でレンダリングするが,画面の周辺部はレンダリング解像度を落とすことで処理の高速化を図っているという。

 フラクタルで生成される図形には,座標値とノーマル値しか存在しない。次に,これをどのように表示していくかについて語られた。フラクタル図形の着色では,関数からの距離で色分けするOrbit Trap法が使われることが多く,今回のCORALでもOrbit Trapが使われている。複雑な図形なので,影を付けたり,アンビエントオクルージョンなどが非常に効果を発揮するとされていたが,それらはどれも負荷が高い。さまざまな処理をノーマルを使って擬似的に表現していくというのが基本となる。

[GDC 2018]Cone Marching法で描くフラクタルVRの世界「CORAL」
 
 できるだけの負荷軽減をして,できるだけ表現力を上げてとさまざまな工夫がこらされているわけだが,Cone Marchingで広範囲の計算を行うとすべてが台なしになる。そこで遠くは表示しないということが重要になる。CORALでは,遠いところは霞ませるという手法が取られている。計算自体はHomogenious Scattering(均質散乱)ということでモダンな香りがするが,考え方自体は古典的な手法といえる。遠くが見えなくても「CORAL」というタイトルから想定される海底の様子だと思えば,ほとんど気にならない。

 このようにして作られたデモは,なかなか圧巻だ。フラクタルの宇宙(海?)を自由自在に動き回って無限の展開を楽しめるのだ。VR体験としてもかなり異質なものといえるかもしれない。

 今後はDepthの推定で時系列のデータを使って高速化を図ったり,画面空間に合わせたノーマルを出すことで処理の単純化を図るなどが予定されているという。現状でもかなり面白い映像が得られるので,興味のある人はプロジェクトのページを参照してみるといいだろう。

CORALプロジェクトサイト