11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】VRゴーグルにGaussianSplattingデータを出す【slapsplat】

Posted at

はじめに

ここ最近、GaussianSplattingが急激に話題になっています。
NianticがリリースしているScaniverseでもSplatでのスキャンを前面に押し出しており、
撮影環境やスキャン速度、結像精度などがどんどん向上しています。

しかし、GaussianSplattingで撮影したデータは実は行き先があまり揃っておらず
スキャンしてもデータを持て余すことが多々あります。
(スキャンしてないから持て余してない?そうね、、、)

そんな中、GaussianSplattingをVRChatで表示できるShaderslapsplatが登場しました。

今回はslapsplatをカスタマイズして、VRChat内ではなくVRゴーグル単体アプリとして
手軽にGaussianSplattingを表示できるようにしてみました。

TL;DR

手順書は↓こちらにもあります。

slapsplatとは?

cnlohr氏が公開しているVRChatワールド制作向けのShaderで、
AudioLinkやTexel Video Playerなど、VRChat向け機能との連携が強い「映えシェーダー」です。
VRChatサンプルワールドはこちら↓

「VRChat向け機能との連携が強い」というのは逆に言うと、
VRChat以外だと使いにくいという意味でもあります。
そこで今回はVRChat向け機能を廃し、
ただUnityでGaussianSplattingを表示するためのShaderとして
.cgincや.shaderの最適化を行いました。

slapsplat_G

後ろにGをつけただけの安直なネーミング
ファイル構成の最適化を行った結果、Shaderの構成要素が2ファイルのみになりました。
一応リポジトリ内にサンプルも入っているので、クローンすればいつでも見られます。

実装手順

実際にUnity新規Projectにインポートし表示するまでの手順です。

0.UnityPackageインポート

リリースページから最新の.unitypackageをダウンロードし、プロジェクトに展開します。
サンプルデータ入りのため80MB近くと大きめですがご了承ください。
Shaderのみのため、Unityのバージョン依存はありません。

1.plyデータの変換

.plyファイルをUnityで描画する用の各種.assetに変換します。
変換用ツールがslapsplat_G/process/下にありますので、
リポジトリをCloneするか、Zipダウンロードしておいてください。

processディレクトリに移動し、コマンドラインでCreateSplatAssets.batを利用します。
同じディレクトリ内にplyデータを配置し、以下のようにコマンドを叩きます。
(以下sample.plyというファイル名だった場合のコマンド・出力結果です)

CreateSplatAssets.bat sample.ply

生成に成功するとsample_resultフォルダ内に各種アセットが保存されます。
このフォルダごとUnityにインポートしましょう。

2.UnityでMaterialを作る

Material作成後、Shader選択でSlapSplat_G/SlapSplat_Gを選択し、
Geo Data Order Dataにそれぞれ
出力データフォルダ下にあるsample_geo sample_orderを適用します。

詳細パラメータについて

テクスチャを適用したら下にある各種パラメータを調整していきます。
後述のシーン配置後に画面を見ながら調整しましょう。

Custom Scale

GaussianSplattingの1カケラの大きさを調整できます。
0.9~1.1くらいがちょうどいい気がします。(物による)
(少なくともNerfStudio/SplatFactoからそのまま出力した車両GSデータとしては、
 1.1くらいでちょうどよさそう)

gamma

ガンマ値です。基本的に1で大丈夫です。

emission amount

カケラ自体の発光度合いです。
下記のbrightnessとセットで調整になりますが、
emissionをブチ上げてbrightnessを下げるとplyの元データのライティングに近くなります。

brightness

全体の発光度合いです。
こちらは0.1~0.3程度に抑えて、emission amountで調整すると意図した描画になりやすい気がします。

余談:geoとorder

一応それぞれのテクスチャファイルの中身ですが、slapsplat元リポジトリによると
geometryテクスチャがXYZ座標、XYZスケール、XYZ回転、色の情報を持っており、
orderテクスチャはレンダリングの最適化用で、奥行き方向の情報を早期に検出し、
裏側に存在するGaussianSplattingを描画しないために使っている模様です。

because otherwise there would be far too much overdraw to be practical.
そうしないとオーバードローが多すぎて使い物にならないためです。

3.シーンに配置する

sample_resultフォルダ内にあるsample_meshをシーンにD&Dすると
MeshFilterMeshRendererを持つオブジェクトが生成されます。
そのままの状態では何もレンダリングされていませんが、
MeshRendererに上で作ったMaterialを与えるとシーンに描画されます。

4.各種パラメータ調整

あとはSceneビューに描画されているGaussianSplattingデータの明るさや、
カケラの大きさなどを調整し、意図通りの描画になるようにMaterialを調整します。
前述のemissionとbrightnessの関係に関しては恐らくケースバイケースなので、
色々いじってみてください。

5.VRゴーグル(Meta Quest 3)で表示

シーンに表示さえ出来ればQuest3に持っていくのはそこまで難しくはありません。
(OVRCameraRigを持ってくるまでは他の記事を参照ください

VRゴーグルで扱う場合の唯一の注意点として、
このShaderはSingle Pass Instancedに対応していません。
上部メニュー/Edit/Project Settings/XR Plug-in Management/OpenXRから
Render ModeMulti-passに変更してください。

あとはよしなにビルドして、Quest3に展開したら
いつでも家の中でGaussianSplattingモデルを眺め回せるアプリの完成です。

完成!&おわりに

GaussianSplattingはまだ未発達の領域で、スキャン自体も難しい(?)し
結像にはだいぶ強いGPUが必要ですし、結像できたとて出口の少ないデータ形式です。
そんな中で手軽にUnityで表示できるようにしてくれたslapsplatはかなりの偉業だと思います。

ただガウス分布を半透明ではなく全面レンダリングしてしまっているため、
GaussianSplatting特有の「リアルな写真っぽい描写」にはまだ及ばないかなという状態です。
この分野は発達の著しい領域なので、将来的にはVRゴーグルでも
超キレイなGaussianSplattingモデルを見られる日が来るかもしれませんね。
(半透明重すぎるから、何かブレイクスルーが無いとキツい気はする)

最後まで読んでいただきありがとうございました。
もし記事内で分からないことや間違っている部分がありましたら、
コメント欄かごんびぃーまでご連絡をいただければと思います。

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?