15.5K Views
October 26, 22
スライド概要
独自に開発したコンバータによるVRChatでの大規模点群の使用(「デジタル上野の杜」( <a target="_blank" href="https://dt.geidai.ac.jp/?p=827">https://dt.geidai.ac.jp/?p=827</a> )のために開発)について解説します。ランタイムのC#によるスクリプトが使えないなどの限定された条件の中で、LODや空間分割などを実現し、描画負荷低減とデータ圧縮を行い、1億点近い点群をリアルタイムで描画できます。また、点群の取得、処理についてのノウハウを紹介します。
こんな人におすすめ:
・点群表示で困っている方
・レーザースキャナーなどで取得した点群を活用したい方
・大規模点群をC#スクリプトが使えないソーシャルVRに持ち込みたい方
受講者が得られる知見:
・ランタイムスクリプトなしで大規模点群を描画する負荷軽減方法
・大規模点群をVRChatで使用する手法
・大規模点群の処理ノウハウ
出演:
於保 俊 (株式会社ホロラボ)
--
初出: SYNC 2022 #UnitySYNC
https://events.unity3d.jp/sync/
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
大規模点群で VRChatワールドを作る 株式会社ホロラボ 於保 俊
自己紹介 於保 俊 (おほ すぐる) @ohomagic 株式会社ホロラボ ソフトウェアエンジニア 測量会社→スマホゲーム会社→ホロラボ Unity、XR、Web系、地理情報など 広くそこそこ深くな雑食系エンジニア
会社概要 株式会社ホロラボ 事業内容 Windows Mixed Reality他、xR技術やセンサー技術に関する ・調査研究 ・システム/アプリケーションの企画開発 ・普及啓発活動 設立 2017/1/18 住所 東京都品川区西五反田 2-25-1 インテックス五反田ビル 3F 資本金 93,940,000円 (2019/8増資) 3 取締役 5名 従業員 51名 Web https://hololab.co.jp/
目標:1億点くらいの点群をVRChatで表示する 条件 • • • • • スマホでも動く描画負荷 データ容量もなるべく少なく 「自前のスクリプト」が動かない ジオメトリシェーダーが使えない 自前のスクリプトが動かないのが一番制限としてきつい...
点群描画:先行事例 https://github.com/keijiro/Pcx 点群大量描画の負荷が課題 ソーシャルVRに点群を持ち込みたい ソーシャルVRに点群を持ち込みたい[2] モバイル対応編 クワマイさんの事例 テクスチャ画像としてデータを持つ 点群大量描画の負荷が課題 BA_PointCloud 大規模点群の描画に対応しているが、実行時に独自スクリプトが必要 今回は最初に対象外としたが、通常のUnityプロジェクトではお勧め
自分で何とかしよう! ベースをクワマイさんのテクスチャに座標情報を格納する仕組みの 点群描画として、これをチューニング(魔改造)する 点群データ 座標値テクスチャ & 色テクスチャ 頂点シェーダー テンプレート メッシュ 座標値テクスチャの座 標にしたがってテンプ レートメッシュの頂点 を移動し、カラーテク スチャから色情報を与 える フラグメントシェー ダー 点を描画
分割と圧縮
なぜ分割するか? 視錘台カリング、LODが有効になるように空間分割する その過程で、データを圧縮する
点群の階層空間分割とデータ圧縮 5m、10m、20mそれぞれの立方体の ブロックで全体を分割 各分割レベルで重複が出ないように点 を配分 →LODで遠景もうまく見えるように ブロック内の点の座標をXYZそれぞれ を1byteの整数であらわす 5mのときは2㎝くらいの誤差 許容範囲と判断
色の圧縮=パレット化 ブロック内の色の分布をプロット →ブロック内は近い色(右図) パレット化してパレットは全体で集約 パレット化することで RGB3Byte→1Byte+パレットテクス チャ
1点あたりのデータサイズ 結果、テクスチャのR,G,B,Aを X,Y,Z,パレット番号として扱う XYZ 4Byte×3 + RGB 1Byte×3 = 15Byte だったのが、 XYZ 1Byte×3 + RGB 1Byte = 4Byte 約1/3の大きさのデータサイズにできた! (※不可逆の変換にはなります)
テンプレートメッシュの工夫
Boundsを正しく設定するメッシュ 参考にしたクワマイさんの例だと、三角 形を並べていた →MeshのBoundsが適切に設定されな い=視錘台カリングが× ちょうど5mの立方体に収まるように、点 のもとになるテンプレートメッシュを作成 結果として棒が並んだだけのメッシュに なった Boundをスクリプトで設定しなくていい
ドローコール削減のため集約
ドローコール削減のための集約 分割したことで、マテリアル・オブジェクト数が莫大に →ドローコールが爆発→高負荷 近いブロックを集約してマテリアルを共通化、テクスチャもアトラス化 →バッチングとGPUインスタンシングでドローコール削減と負荷低減
データの局在化とアトラス化 位置的に近いところの区画のテクスチャをまとめる テクスチャ数で空間を等分し規定の数に収まるところでアトラス化する
オフセットテクスチャでマテリアルをまとめる テンプレートメッシュの位置から、オフセットテクスチャを介して、点群テクスチャ とパレットテクスチャの何番目を使うかを決定 →同じマテリアルでもブロックごとに違う描画 オフセットテクスチャのRGBから座標・ 色テクスチャの位置、パレットテクス チャの位置を指定 座標情報からブロックのインデックス値計算 →オフセットテクスチャの位置を指定 点座標・色テクスチャ 配置されたテンプレートメッシュ オフセットテクスチャ パレットテクスチャ
ワールドの構築
エディタ拡張でデータから構築 コンバーターはテクスチャとテキストファイルを書き出す マテリアルの構築=適切なテクスチャを持つマテリアルを自動生成 メッシュの配置=適切な場所にテンプレートメッシュを配置 LODの設定=LODコンポーネントを自動的に全メッシュに設定 LODの設定 テンプレートメッシュの配置 マテリアルの構築
足場用メッシュコライダー作成 点群からメッシュ化したものをベースに、NavMeshを生成 そのNavMeshをOBJに書き出し多少加工することで、コライダー用メッシュを作 成 →実際に歩ける範囲を比較的低コストで作成できた 点群からメッシュ化 NavMesh作成→OBJ化 加工してコライダー用メッシュに
VRChatワールドへ! デジタル上野の杜 プロジェクトWebから動画引用 https://dt.geidai.ac.jp/?p=827
まとめ 大規模点群を自前のスクリプトが使えない環境で軽量に描画する仕組みを開 発した 前処理、シェーダー、エディタ拡張など、様々な手段を組み合わせて実現でき た パフォーマンス向上や新しい表現などのアイディアとして参考になればうれしい
最後に 制約の少ないところならこんなピーキーなことやらなくてもいい だけど、制約があると魂が燃える! なお、普通に点群をUnityで表示するならBA_PointCloud超お勧め
ご清聴ありがとうございました
おまけ VR点群エディタなるものを作ってみた ら便利だった!
おまけ2 もっと軽く、速く パレットの集約 アトラス化の最適化 コンバーターも遅いのでnumpyのNativeArrayとか使うともっとましになるかな データを圧縮するには? Dracoの点群圧縮が面白い