夜風のMixedReality

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

Microsoft MixedRealityToolkit GraphicsToolsを完全に理解できる

こちらの固定ページでは筆者も開発に参加しているMicrosoft MixedRealityGraphicsTools(MRGT)に関して紹介していきます。

GraphicsToolsStandardShaderに関してはこちらを参考にください。

本記事内で使用している画像の一部に関してはMicrosoft のドキュメントもしくはMRTKのGitHubのものを使用しています。

公式のドキュメントはこちらになります。

learn.microsoft.com

 ここではドキュメントに合わせ筆者が実際に触りながら知った知識などをまとめていきます。

〇MRGTとは?

MRGTはタイトルの通りMicrosoft社が開発、提供しているMixedRealityデバイス向けの開発ツールMixedRealityToolkit(MRKT)で提供されているグラフィック関連のパッケージを指しています。

正確にはMRTK GTが正しい略だと思いますがプロジェクト内でもMRGTと略されているため本ブログではMRGTの略語を使用していきます。

 2022年現在ではUnity向け、UnrealEngine向けの2種類が提供されています。筆者はUEに関して詳しくなれていないので特に明記しない限り記事内ではMRGT=MixedRealityToolkit GraphicsTools for Unityで紹介します。

github.com

〇MRGTの成り立ち

MRGTは2022年6月にMRTK3パッケージの一つとしてリリースされました。

MRTK3とはMixedRealityToolkit3のことを指しており、3は第三世代を示しています。

ここでは第一世代、第二世代とMRTKの進化を紹介します。

〇第一世代MRTK

最初のMRTKはHoloToolkitと呼ばれていました。

 これはHoloLens専用のUnity向けSDKという形で提供され、のちにWindows MxiedRealityイマ―シブヘッドセット(VR)型に対応する形で提供が始まりました。

現在と同様HoloToolkitの時代からGitHub上でオープンソースの形で公開されていました。

HoloToolkit時代はまだアーキテクチャが整えられておらず、例えば空間認識を行いたい場合HoloToolkitで提供されていたSpatialMappingプレファブをシーンに配置していました。

〇第二世代MRTK

 2019年に登場した第二世代のMRTKはHoloLensだけではなくVRも対応するようになり、より多くのMRデバイスをサポートしてほぼ同じコーディングでマルチプラットフォームなMRデバイスへのアプリ提供ができるように名称変更だけではなくSDKの運用に関しても一新されました。

 名称としてはMixedRealityToolkit v2と呼ばれています。

 具体的には従来機能ごとにPrefabをシーンに配置していたのに対してMRTKv2ではデバイスごとのプロファイルを使用することで動的にそのデバイスに必要なデバイス側の機能が提供されるようになりました。

 また新しいUnityのXRPluginManagementへの対応やデバイスを跨いだAPI規格であるOpenXRへの対応、MetaQuestへの対応などが行われました。

 前世代との大きな違いとしてProfileを採用したことが挙げられ、デバイスごとの機能を集約しています。   これによってシーン内のコンテンツをいじることなくデバイスに応じたProfileに差し替えることで幅広くデバイスに対応するようになりました。

 本記事公開時2022年末まではMRTK3はプレビューとして提供されているため商業アプリなどの実戦アプリケーションはMRTKv2が使用されます。

 また、MRTKv2で幅広いデバイスをサポートするようになったことを受けて各種プラットフォームでもMRTKをしようした開発のサンプルが提供されるようになりました。(MagicLeap2など)

〇第三世代MRTKとGraphicsTools

 MRTKv2の問題点を解消して完全にOpenXRプラットフォームにのっとって提供されているのが第三世代のMRTKです。

 具体的なMRTKv2の問題点の一つに依存関係があげられます。

 例えばShaderやEditorツールだけを使用してコア部分はOVRIntegrationから提供されている機能を使用したいといった場合でもMRTKv2の場合はMRTKのコア機能など余計なパッケージの導入も必要でした。

 正確にはコアパッケージの中にShaderやEditorツール、HoloLensのSDKなどがひとまとめにされていました。

 MRTK3ではこの点を受けて従来のMRKTのコアという形ではなく、ユーザーのシナリオに応じて細かくパッケージが分離され、ユーザー側でどの部分を使用するのかを選択できるような設計になりました。

 MRGTはこの考えに基づきグラフィック関連の機能だけ抽出されパッケージ化され登場しました。

 MRGTはMRTK3で提供されるほかのパッケージ以上にデバイスの機能に依存しない作りとなっており、これが理由と思われますが、MRTK3の中でリリース初期から唯一プレビューではなく正式なリリースとして登場しています。

 余談ですがMRTKv2のvがバージョンを指していたのに対してパッケージが多くなったためそれぞれのパッケージバージョンをそろえる運用が難しくなるためvを抜いて第三世代という意味でMRTK3と略されています。

〇MRGTの特徴

 MRGTは名前の通りグラフィックに特化した機能が提供されています。

 前述の説明と被りますが、MRTKv2ではMixedRealityToolkit.Faundationで提供されているコアパッケージにMRTK StandardShaderなどのシェーダーシステムも同梱されており、シェーダーを使用したいだけにも限らずMRTKのコアを導入する必要がありましたが、この依存関係が解消されています。

 またこちらも前述の説明と重なりますが、MRGTはUnityでのグラフィックシステムとしてデバイスからの依存が少ないシステムでとして提供されているため、特に依存性の少ないパッケージとなっています。

 提供されているアーキテクチャは主に次のようになります。

  • MixedReality-GraphicsTools-Unity
    • com.microsoft.mrtk.graphicstools.unity(パッケージ名)
      • Editor
      • Runtime
      • Samples

・Runtime

 主に実機で使用されるランタイムに使用される機能が格納されています。

 StandardShaderなど実機で機能するものはRuntimeにコアがあります。

・Editor

 主にエディタ上でのツールやShaderGUIといった機能が格納されています。

 Assets内のEditorフォルダ同様、メジャーツールやStandardShaderをinspectorに憑依する際のカスタムGUIなどUntiyEditor内でのみ使用され逆に実機で必要としていない開発ツールが主に格納されています。  

・Samples

サンプルが格納されています。この中には実験的な機能もサンプルとして提供されることがあり、このような機能はファイル名に(Experimental)という名前がついています。

機能別にみると次のようになります。

  • シェーダーシステム
    • xRに特化した軽量多機能なStandardShader
    • TextMeshProなどのUnityUIを代替するシステム
  • ユーティリティシステム
    • 拡大鏡機能
    • 背景色によるUIテキスト色反転機能
    • ぼかし機能
  • エディタツール
    • シーン内でのオブジェクトの寸法、距離を可視化するメジャーツール
    • スクリーンショット撮影機能

〇FluentDesigneシステム

MRGTはMicrsoftの提唱するUIデザインシステムであるFluentDesigneの考え方をベースに提供されています。

FluentDesigneはWindowsのUIにも使用されている考え方です。

www.microsoft.com

〇対応プラットフォーム

MRGTはMRTKの一つとして提供されているためHoloLensやMetaQuestなどのxRデバイスにおいて最大限パフォーマンスを発揮するように作られています。

 しかしパッケージ自体の依存関係は少なくiPhoneやAndroid、コンソールゲーム機といったプラットフォームでも問題なく動きます。

 ここでは筆者が動作確認をしたことがあるデバイスを一覧として紹介します。

 ・Windows PC

 ・Microsfot HoloLens

 ・Microsoft HoloLens 2

 ・MetaQuest (MetaQuestPro)

 ・MagicLeap 2

 ・Pico Neo3 Link 、Pico4

 ・Windows

 ・Android スマートフォン

〇MRGTの導入

 MRGTの導入はGitHubから直接パッケージをインポートする方法とMRFeatureToolsを使用してほかのMRTKパッケージと一緒に一括管理しながら導入する方法の2種類が公式の方法としてあります。

redhologerbera.hatenablog.com

〇Graphicstools StandardShader

MRGTのメイン機能です

MRTKv2までMixedRealityToolkit StandardShaderと呼ばれていたシェーダーシステムの後継機になります。

特徴としてすべての機能がHoloLensをはじめとしてxRデバイスでの使用を前提に開発されている点です。

xRデバイスの特徴として右目、左目で2回描画が行われています。

このためほかの一般的なプラットフォームよりレンダリングよりもレンダリングコストがかかります。

 この最適化の仕組みとしてSinglePassInstancingRendering(シングルパスインスタンシングレンダリング)と呼ばれる機能が働いていますが、この仕組みに対応していないシェーダーを使用した場合左目だけが描画されて右目が描画されないといった現象が起こります。

 GraphicsToolsStandardシェーダーでは最初からシングルパスインスタンシングレンダリングに対応しているためxRに最適なレンダリングを行うことができます。

また最大の特徴としてUntiyのビルドイン、URPに対応しており、シェーダー内でパイプラインを検知して最適な処理になるように自動でコンパイルされます。 ただし一部の機能に関してはURPのRenderFeatureを使用しているためビルドインレンダーパイプラインでは動かないものがあります。

〇多くの機能

もう一つの特徴として非常に多くにわたる機能を持っていながら使用する機能のみにレンダリングコストを払う仕組みとなっており、幅広い表現が最低限のコストで実現できます。

 この機能自体はUnityで提供されているShaderバリアントを使用しており、各機能ごとに#if defined()~#endifと条件コンパイルが働いています。

この機能に関しては記事が長くなるため別ページでまとめています。

redhologerbera.hatenablog.com

〇ユーティリティツール

〇拡大鏡

 拡大鏡は比較的新しく導入された機能です。

 アクセシビリティの観点からアプリケーション内での快適な体験をより多くの人が行える等にというロービジョンの方々の使用を想定して開発が行われました。

 機能開発に際して以下のMicrosoft ResearchのVR内でのロービジョンの方々へのVRのアプローチがきっかけであることがイシューで述べられています。

www.microsoft.com

github.com

〇テキストの背景色反転

MRGTには専用のTextMeshPro用のシェーダーが提供されています。

 これを使用することで背景の色に合わせてテクスチャの色を反転させる機能があります。

 この機能を使用することでユーザーは文字をより認識しやすくなります。

redhologerbera.hatenablog.com

〇ぼかし(アクリル)

アクリルはFluentDesigineシステムに基づいて提供されている機能で、 この機能はURPのRendererFeatureを使用しているためURP専用の機能になります

すりガラスのような表現ができ、テクスチャ専用の2D、現実同様背部にあるオブジェクトに対して行う3Dと2つのモードが存在しています。

〇エディタツール

エディタツールはUnityエディタ上で使用される開発者向けの効率化ツールです。

〇メジャーツール

メジャーツールはUnityエディタ内でのオブジェクトやオブジェクト同士の距離、大きさを測ることができる機能です。

redhologerbera.hatenablog.com

〇スクリーンショット撮影機能

 MRGTにはスクリーンショット撮影機能があります。

  redhologerbera.hatenablog.com

 特徴としてUnityのカメラを使用しており、Pngで背景をくりぬいた画像を出力することができます。

 現在Shift(or Alt)キー+2(or4)のショートカットを使用することで2倍、もしくは4倍の解像度でスクリーンショットを行えます。

 

〇MRGTの発展

MRTGに限らずMRTK3ではオープンソースで開発が行われています。

そのためバグや質問、提案といったディスカッションをGitHubのイシューで行うことができます。

また、MRGTへの貢献方法に関してはこちらを参考にしてください。

redhologerbera.hatenablog.com