3
3

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】VisionPro 上でAROcculusionの実現方法【VisionPro】

Last updated at Posted at 2024-04-17

TL;DR

  • AR/Basic Occulusion Shader を使えば実現できます
  • 公式ドキュメント 通り、やっぱりできなかった
    • URP のBlend mode が "Alpha", "PreMultiply", "Additive" の3種しか対応してないため
  • 今後のサポート次第では可能になるかも
  • 現状はUnityにヒアリング中

検証環境

項目 バージョン
Unity Unity2022.3.20.f1
PolySpatial 1.1.6
VisionOS 1.0.3
URP 14.0.10

目的

VisionPro はARanchorの性能やMesh 検知の精度が非常に高いので、これを用いて
AROcculusion を行って、Unity空間上で生成したObjectを現実の物体の背後にいたら隠れるようにしたかった。

AROcculusion の方法

一般的なARのOcculusionの実現は大きく分けて2通りあります

  1. DepthMap を用いて該当Objectの描画判定を行うかどうか判断するロジックを入れて実現
  2. 現実世界のObject をMesh 情報として受け取り、そのMeshを透明で描画&その背後のObject は透明で描画させる
    1の方法はAR系では王道であるが、VisionPro は現在のカメラ映像はおろか、深度情報もプライバシー保護の観点から取得不可能。

一方、ARMesh についてはARFundationのコンポーネントでもよく使う ARPlaneManager であったり ARMeshManager 経由で情報を取得可能です。

これはVisionOS側 (≠ ARKit ) のAPIがMesh情報を返してくれるので、これをPolyspatial側がラップしてARFoundation経由で使えるという仕組みです(スマホARとかやってた人なら、基本セットのアレね という感じです)

Meshの背後を透明にするShader

透明Object の描画なのでTransparent で Blend zero zero とやってしまうことで、自身も透明、背後Object も透明とさせることができるので、これでそのままARの映像を一番奥に描画してもらえれば実現できます。

ただ、このやりかたはOpaqueはどうすんの? という問題があります。

そこで @aa_debdeb さんが紹介している Opaqueよりも一歩早めに透明ピクセルを描画する というやり方です

簡単にいうと、DepthMap はとれないけどMesh があるならそれの深度情報を先に書き込んでしまえということですね。

VisionPro への導入

PolySpatial <= 1.0.0当時はShaderGraph Only でしたが v1.1.Xになってからは、一部カスタムShader(URP) もサポートされるようになりました。

そこで上記記事はもともとURPで書いてあることからそのまま実行してみました。

結果

会社のオフィスの壁で試してみたのですが、アプリ起動前はこの見た目が

IMG_0005.PNG

壁や天井などMesh を検知して透明で描画するはずの部分がこんな感じで真っ黒になってしまいました。

IMG_0004.PNG

Shader はInspector ではちゃんと透明になっていたため、やっぱり Blend zero が未対応だからこのような結果になっていると思われます

Unity に問い合わせてみたら

Unity 中の人からの返答をもらいました。
結論としては AR/Basic Occulusion Shader を利用することで解決ということです。

再実験

AR Occulusion できてる!!

Apple のShader/Materialについて

基本知識

Apple の現在のMaterial は こちら のドキュメントにもある通り、 Unlit , PBR , Occulusion , Shadow Receiving Occlusion の4種が主なMaterialです。

PolySpatialでは上記のいずれかにUnityのMaterial(Shader) をマッピングするそうです。

また、先の実験で Blend mode "Zero" は現状Apple側はサポートしてないため、透過を扱うには "Alpha" のモードで値を0にする必要があるとのことです.(もちろんRenderQueue はTransparent)

余談ではありますが、現状のPolySpatial 1.1.x系だと、 頂点を操作するようなShader については ShaderGraph製のみサポート とのことで、手書きのCustomShaderは頂点を変更するようなものでなければ一部利用可能とのことです。

参照: UnityのPolySpatialのフォーラムでUnity公式からの回答より

AR/Basic Occulusion Shaderについて

今回の AR/Basic Occulusion Shader はAppleのMaterial でいうところの Occulusion にマッピングされることから、今回のAR Occulusionが利用可能とのことです。

まとめ

  • PolySpatial でAR Occulusionをする場合は AR/Basic Occulusion Shader を用いましょう
  • Swift UI で実現する場合は Occulusion , Shadow Receiving Occlusion Materialを設定すれば実現できるようです
3
3
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
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?