夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

MapSDKfor UnityをURP(UniversalRenderPipline)プロジェクトで動かす

本日はMapSDKの枠です。

〇MapSDKとは?

[Microsoft Map-SDK for Unity(以下Map-SDK]はMicrosoftが提供しているBing Mapの情報をHoloLensをはじめとするMixedRealityデバイスで使用できるツールです。

これを使用することで自身のアプリに簡単に地図を実装することができます。

また,Map-SDKの特徴として地形や場所によっては建物などを立体的に表示、見ることができます。

〇URPプロジェクトで使用する。

Universal RPのプロジェクトではHoloLensを含むマルチプラットフォーム環境下で軽量かつリッチな描画を行えます。

 また、ShaderGraphやVFXGraphなどの見た目にかかわる機能を使用することができ、URPと比較した従来のRP、ビルドインレンダーパイプラインに置き換わりスタンダードになるとも言われています。

 反面従来のShaderの機能など一部が使用できないことで特にMaterial回りがエラーを出してしまいます。

 MapSDK for Unityも同様でURPプロジェクトに変更したと同時に以下のようにShaderエラーを示す蛍光ピンクになってしまいました。

f:id:Holomoto-Sumire:20210502162607j:plain

 通常のUnityのオブジェクトはメッシュを格納する[MeshFilter]とマテリアルと関連付け描画を行う[MeshRenderer]が存在しており、URPに移植した際にinspectorウィンドウに表示されるMaterialのShaderを変更することでエラーを解消します。

f:id:Holomoto-Sumire:20210502165549j:plain
UnityプリミティブCubeのインスペクターウィンドウ

MapSDKの場合は特殊でそもそもUnityのプロジェクト側でMeshを持っているわけではなく[Map Renderer]コンポーネントによって描画が管理されています。

f:id:Holomoto-Sumire:20210502165506j:plain

そのため通常ならinspectorウィンドウに表示されるマテリアルが表示されません。

MapSDKではこのような特殊な環境下で開発者が独自のマテリアル、Shaderを設定したい場合に使用する[use Custom Terrain Material]という設定項目が用意されています。

f:id:Holomoto-Sumire:20210502170514j:plain

ここに任意のマテリアルをアタッチしマップの描画のマテリアルを変更します。

と言ってもShaderを自作することはかなり困難です。

Githubのイシューにもこのことに関してのやり取りがあります。

github.com

「新しいスクリプタブルレンダーパイプラインのサポートはされていますか?」

Are there any plans to support the new Scriptable Render Pipeline?

これに対してMS側開発者の回答が

「将来的に実装する機能になるが現時点でサポートはされていない。」

This is a future item for us to address. No immediate plans to provide default LWRP/HDRP variants of the shader.

I assume the shaders we provide do not work with LWRP/HDRP (I haven't tried though to confirm). We do allow for specifying a custom material to render the map, so if projects are targeting these pipelines, it is possible to get the map rendering correctly under an SRP by converting the existing shader and creating a new material based on that.

とのことで独自実装するしかありませんでした。ところが数日前に別の開発者がUnitypackageとともに投稿を行いました。

「とてもシンプルなソリューションを作ったよ(UnlitでMRTKのサポートなし)」

I have a very basic solution for this (Unlit, no MRTK support). I basically converted the MapsSDK/StandardTerrainShader in a simpler Vertex/Fragment shader. I also duplicated some .cginc files so that I could place them in the same folder of the modified shader. It works fine with Universal Render Pipeline (probably in HDRP, too, but not tested).

今回このイシューに挙げられていたUnityPackageを試しました。パッケージはイシュー側で変更がある可能性があるので前述のリンクから入手してください。

①入手したパッケージをインポートします。

f:id:Holomoto-Sumire:20210502162822j:plain

②[MapRenderer]コンポーネントの[use Custom Terrain Material]から[MapsURPTerrain]マテリアルをアタッチします。

f:id:Holomoto-Sumire:20210502170514j:plain

これによってピンク色だったマップが元の描画に戻りました。

f:id:Holomoto-Sumire:20210502171611j:plain

台座のマテリアルは[Use Custom Clipping Volume Material]にチェックを入れマテリアルを設定します。

f:id:Holomoto-Sumire:20210502171920j:plain

以上でMapSDKをUniversalRenderPiplineで動かすことに成功しました。

f:id:Holomoto-Sumire:20210502172557j:plain