Real-time Dynamic Level of Detail: RDLOD
今回は開発中の機能 "RDLOD" を紹介したいと思います。
"RDLOD" 機能は「高分解能でも"都合良く" GONDWANA を軽くする機能」です。実装後は標準で有効となり、実行中に on/off を手軽に切り替えられるようになります。
この機能の on/off で何が変わるのかを表に整理しました。
RDLOD | on (標準) | off |
---|---|---|
動作の互換性 | 0.702 以降の新機能 | 0.701以下までと同様の動作 |
同じ「分解能」での動作の軽さ | より軽い | より重い |
注視点から近い部分の「分解能」 | 「分解能」で設定した値に近い | 「分解能」で設定した値に等しい |
注視点から遠い部分の「分解能」 | 「分解能」で設定した値より低い | 「分解能」で設定した値に等しい |
注視点から遠い部分の「分解能」の変化の境目にチラつきが発生する可能性 | あり | なし |
GONDWANAのタイルマップにおける「分解能」は可視化における地形の再現性に直結する要素なので、新機能 RDLOD を on にした状態では速度のために見た目が劣化してしまうのではないかと懸念されるかもしれません。その答えは YES ではありますが、事実上 NO でもあります。
カメラの位置を上空に上げ、 RDLOD を on/off した状態それぞれで「塗+線」により3D描画の地形のサンプリング点やポリゴンがどのように見た目上変化しているかをわかりやすく撮影した絵を用意しました。
絵の右側は実際には画面の中央、カメラの注視点付近、絵の左側は画面の左端に近い部分を切り抜いたものです。「分解能」はあくまでも「地形」の分解能なので、地図の見た目のアピアランスは特に真上から見ている状態では変化しません。RDLODで変化するのはカメラの注視点から遠方の「地形」の粗さのみです。
注視点付近はもちろん設定した分解能で綺麗に可視化したい状況が一般には多いでしょう。また、可視化するタイルの広さも地図全体を認識しやすくするためある程度広く可視化したい状況が多いと思います。しかし、注視点から遠い部分は、それほど高い分解能で地形を可視化する必要性が無かったり、そもそも画面上でも遠くに表示される部分となるため高い分解能で計算しても有限のピクセルと人の視力では潰れて見えない部分になる状況が多いでしょう。
そこで、注視点から遠い部分の分解能を、注視点に近い部分よりも下げて負荷を低減するような処理を3D可視化等の専門分野では一般に Level of Detail (LOD; 意訳すると「段階的な詳細度」)と呼び、特に3Dの町並みやキャラクターやがたくさん表示されるようなゲームソフトウェアなどで一般に使われる定番技術の1つになっています。ちなみに、ズームレベルによるタイルマップの仕組みも広義では LOD 技術の実装方法の1つの形と言えます。
LOD は一般に近くの町並みは建物の形状を正確に表現したポリゴンデータを用意しておき、やや遠くに表示する場合にはポリゴンの頂点を減らしてディティールを省略したポリゴンデータを用意しておき、ずっと遠くに表示する時にはもはや単なる平面の板ポリゴンに建物の絵をポスターのように貼り付けるだけのポリゴンデータを用意し、その建物が画面内でどれくらい遠くに表示されるかによって、描画するポリゴンデータそのものを切り替える方法が原始的には使われます。
GONDWANA の新機能 RDLOD では、このような LOD 機能を GONDWANA の実行中に、リアルタイムで動的に注視点付近から遠方に掛けて地形の分解能を変化してサンプリングできるようにGPUで処理を行うため、 Real-time Dynamic がついて RDLOD 機能となっています。
実際の見た目の変化はどうか確認してみましょう。地形のサンプリング点がわかりやすいよう線が可視化されるように、少し低めの分解能となる設定での画面画像を掲載します。
RDLOD: off, 広さ: 32, 分解能: 10
RDLOD: on, 広さ: 32, 分解能: 10
注視点の近くは見た目に変化は無く、注視点から遠くの地形のディティールはややのっぺりと変化している事がわかると思います。また、 RDLOD: off では遠方になるにつれ"見た目上の"サンプリング点が密になっているのに対し、 RDLOD: on では注視点の付近も、遠方も"見た目上の"サンプリング点の密度はグリッドの形状を上手く保ちながらも器用に、無駄に密になり過ぎないように生成されているのがわかると思います。
また、 RDLOD: on とする事で負荷が下がり、例えば 0.701 までは広さ 16 、分解能 12 が快適に使える限界で、分解能13ではややぎこちなく、分解能 14 では忍耐力が無ければ使えない程重くなる環境でも、 0.702 以降は RDLOD: on とすることで従来より +1.5 分解能程度まで実用性能を得られるようになります。この例では分解能 13 まで快適、 14 もややぎこちないが使える程度になります。
動作の軽さの変化については言葉やフレームレート値でお伝えしてもなかなか感覚として伝わりにくいと思いますので開発中の実行時の様子を動画にしました。気になる方は御覧下さい。
なお、先の表でも示したように、注視点から遠い部分の「分解能」の変化の境目にチラつきが発生する可能性が RDLOD: on だと発生する事があります。どういうことかというと、次のような地形のサンプリング点の切り替わりポイントがどのように可視化されるか考えてみて下さい。
このように升目上の単位の大きさが変化する境目で、もし地形の起伏が激しい場合に、さらに、もしほぼ水平に眺めたならば、データによってはこの升目状の大きさの変わる境界の凸凹が綺麗に一致できないために、"スキマ"のように見える事が起こりえます。このため、 RDLOD: on の場合にはそのようなスキマが連なりチラつきとして観測される事がありうる欠点もあります。
そこで用途に応じて on/off しやすいように、また切り替えも円滑に行い視認性の違いも確認し易いよう、タイルマップウィジェットにチェックボックスのユーザーインターフェースを搭載しています。
なお、この機能の実装は順調なのでこの記事で紹介する機能は次回のリリース 0.702 に入れられる見込みで調整中です。
現在は GONDWANAの3D地図可視化アプリケーションとしての特性やニーズから、あまり遠景でもそんなに極端に潰れないような「いいかんじ」となるパラメーターを初期設定したり、あるいは用途に応じてディティールの潰れ具合を調整できるようにしようか検討するなど行っている最中です。