2012年3月26日月曜日

Sparse Voxel Octree(SVO)

大体月1更新の@jirohclです。
今回はここ最近ステマをしているSparse Voxel Octree(SVO)についてです。

SVOとはVoxelOctreeをメモリ効率を上げてマッピングする手法で、
基本的なボクセルデータvec_t rgbaの上位bitをアドレスとして設定します。
これによって空白ボクセル部にメモリを取られず、高効率でボクセルデータを格納することが出来ます。

svo_image

(64bit type):
X: [ID:2][node x:10][node y:4] //ID : leafの所持フラグ
Y:[node y:6][node z:10]
Z:[color r:8][color g:8]
W:[color b:8][color a:8]
※数値はbit

SVOはRaytraceとの親和性が高く、また法線マップなどを使わずに詳細なディティールを表現できるため、
tech6等の次世代のゲームエンジンで積極的に取り入れられようとしています。

しかし、この実装通りに行うと、OpenCLでレイトレースするためには再帰関数がサポートされない関係で
bool hit_geom_level0(ray r,float *t,__global uint4 * geom)
bool hit_geom_level1(ray r,float *t,__global uint4 * geom)
と自前で再帰定義、呼び出しを行わなくてはいけません。
mipmap levelがそこまで高くなければ問題ありませんが、純粋にOctreeを作っていては納得できる分割数に至るまでにかなり階層が深くなってしまいます。
そこでmipmap level N(最大レベル)の分割数をある程度上げ、階層を固定化することでこの問題はある程度解決します。

また、SVOを使用することで、レイとジオメトリとの交差判定で得た距離をLevel of Detailに用いることで比較的簡単にCone Tracingの効果を得られる事も一応記しておきます(まだしっかりと実験していないので詳細は無しで)。

SVO自体の可視化
http://www.youtube.com/watch?v=CJaN38CqHpY&context=C43a407aADvjVQa1PpcFM1-KZzH_fwDhkQS7JnlNktMbYClnWVAl0=
上データを使用した単純なパストレース
http://www.youtube.com/watch?v=M7n8Cy7hGVg&context=C46616bcADvjVQa1PpcFM1-KZzH_fwDnaz0vsZ61jyfCMC7vbypAM=

若干取り留めのない文章になってしまいましたが、この文ですこしでも「よし!SVOやる!」という方が増えてくれれば幸いです。
次回未定。

1 件のコメント: