トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

【Hololens2】MRTKについて学ぶ【公式ドキュメント読むシリーズ】

シリーズ第3弾はCPU,GPUなどのパフォーマンス!

https://partner.microsoft.com/ja-JP/asset/collection/building-a-quality-hololens-2-application-with-the-mixed-reality-toolkit#/

第1弾:デザイン

bibinbaleo.hatenablog.com

第2弾:物理環境(空間マップとか)

bibinbaleo.hatenablog.com

 第3弾:最適化(CPU,GPUなど)

bibinbaleo.hatenablog.com

MRTKとは

microsoft.github.io

f:id:bibinbaleo:20200417145400p:plain

ここらへんはHubsで体験できるね。

MRTK.Examples.Hub_v2.3.0のデモ16個全部やった【Hololens2】 - トマシープが学ぶ

f:id:bibinbaleo:20200417145445p:plain

f:id:bibinbaleo:20200417145451p:plain

入力記録などのツールもあるらしい
f:id:bibinbaleo:20200417145353p:plain

サンプルアプリもあるって

f:id:bibinbaleo:20200417145357p:plain

GALAXY EXPLORERは元から入ってたけど、元素表記表は自分でビルド済みアプリを入れたほうが良さそう。

github.com

遊んだ

f:id:bibinbaleo:20200417162927p:plain

専用Slackもある。リンクから参加できるけど全部英語だったので抜けた・・・

Profiles

microsoft.github.io

MRTKの細かい設定はプロファイルで行う。

f:id:bibinbaleo:20200420133712p:plain

デフォルトだと「DefaultMixedRealityToolkitConfigurationProfile」というVRもHolo12も対応しているプロファイル。

DefaultHoloLens2ConfigurationProfile」はHololens2用

デフォルトとの違い

無効な機能:

対応システム:

 

Hololens1のアプリをHololens2に対応させる

docs.microsoft.com

Unity2018とUnity2019の違い

Unity 2018 LTS Unity 2019.x
ARM32ビルドのサポート ARM32およびARM64ビルドのサポート
安定したLTSビルドリリース ベータ安定性
.NET Scriptingバックエンドは 非推奨 .NET Scriptingバックエンドが 削除されました
廃止予定の UNETネットワーキング 廃止予定の UNETネットワーキング

Unityプロジェクトに入っているDLLがARM64でビルドできない場合は2018を使うべし

IL2CPP

.NETでなくIL2CPPを使おう!でもIL2CPPはビルド時間が長くなるので最適化するために開発者のマシンをセットアップする必要がある。

docs.unity3d.com

  • インクリメンタルビルド

インクリメントビルドを行うには、(ターゲットディレクトリを削除せずに) 以前のビルドロケーションと同じ場所にプロジェクトをビルドします。(上書きでビルドするということ?)

  • プロジェクトとビルドフォルダーをマルウェア対策のソフトウェアスキャンから除外

WIndowsDefenderを無効にする。40~66%ビルド時間が減少した

  • SSDにプロジェクトとビルドデータを格納

HDDよりいいよ!

 

キャッシュサーバーを設定するのもよい

docs.unity3d.com

bibinbaleo.hatenablog.com

ARM

Unity 2018 LTSはARM32Unity 2019.xはARM32およびARM64アプリのコンパイルをサポートします。
パフォーマンスには実質的な違いがあるため、ARM64アプリケーション向けの開発が一般的に推奨されます
アプリケーションのすべてのDLL依存関係を確認します。プロジェクトから不要になった依存関係を削除することをお勧めします。必要な残りのプラグインについては、それぞれのARM32またはARM64バイナリをUnityプロジェクトに取り込みます。

ベストプラクティス

・MRTK標準シェーダーを使う

・デフォルトのMRTK UX(ボタン、スレートなど)を使用

・サンプルシーン、特にHandInteractionExamples.sceneを確認

・Quad、コライダー、およびTextMeshProテキストを使用。uGUIのcanvasは△

・深度バッファ共有を有効にするか、フォーカスポイントを設定

・SinglePass Instances

・DefaultHoloLens2ConfigurationProfile使用

x86→ARM

・すべてのUnityネイティブプラグインVisual Studio 2019にアップグレードしてから、ARM用に再ビルドする必要があり

・アプリケーションが必要なプラグイン用のUWP / ARMプラグインが存在しないことがあります。プラグインプロバイダーに連絡して、問題を解決し、ARMのサポートを提供してください。

・_asm命令はARMでは機能しない

・ARMではSIMD命令セットはサポートされていません。ARMでは、xmmintrin.h、emmintrin.h、tmmintrin.h、immintrin.hなどのさまざまなヘッダーが使用できないためです。

・ARMのシェーダーコンパイラは、シェーダーが読み込まれた後、またはシェーダーが依存しているものが変更された後、最初の描画呼び出し中に実行されるので、フレームレートへの影響が顕著になる場合があり

Unityの推奨設定

他の記事と被っている部分が多い

docs.microsoft.com

・Unity Quality設定をVery Lowに変更する

RealtimeGlobalIlluminationをオフにする。シーンごとに設定しないといけない

f:id:bibinbaleo:20200421104039p:plain

XRSettings

f:id:bibinbaleo:20200421111037p:plain

透明マテリアル

透明オブジェクトやテキストオブジェクトは一般的に深度をレンダリングしない。

MRTKシェーダーを透明にしたら警告が出る。FixNowを押す

f:id:bibinbaleo:20200421112328p:plain

Customになっていい感じになる。

f:id:bibinbaleo:20200421111031p:plain

(アルファ0状態で真っ白にしても透明にならないのに、明るさを落とすと透明になった!どういう状態なんだろう?)

そもそもHololensなら半透明は白と黒の割合で変えたほうが良さそう。

f:id:bibinbaleo:20200421133029p:plain

ハンドメッシュがQuadの奥だと表示されない。これも深度に関係あるのかな?

スプラッシュイメージ

通常のUnityロゴスプラッシュ以外に、WindowsだとWindowsHolographicスプラッシュがあるって!

f:id:bibinbaleo:20200421115323p:plain

ウサギを設定しているOnTrackingLossPause~はトラッキングロストしたときに出る。デフォルトだと山の形の画像が出てる

f:id:bibinbaleo:20200421132930p:plain

これを自分で設定できる。

f:id:bibinbaleo:20200421132926p:plain

移動はしないコンテンツで、追跡ロストの時に中断しなくていいなら、OnTrackingLossPause~のチェックを外す。

Capability

f:id:bibinbaleo:20200421135504p:plain

表2
能力 機能を必要とするAPI
SpatialPerception SurfaceObserver
ウェブカメラ PhotoCaptureおよびVideoCapture
PicturesLibrary / VideosLibrary PhotoCaptureまたはVideoCapture(キャプチャされたコンテンツを保存する場合)
マイクロフォン VideoCapture(オーディオをキャプチャする場合)、DictationRecognizer、GrammarRecognizer、KeywordRecognizer
InternetClient DictationRecognizer(およびUnityプロファイラーを使用)

MRTK Standard Shader

microsoft.github.io

fluentDesignSystemにのっとっている。

サンプルはここで見れる

f:id:bibinbaleo:20200421152427p:plain

f:id:bibinbaleo:20200421152429p:plain

UnityStandardとの比較もある Unity← →MRTK

f:id:bibinbaleo:20200421152257p:plain

レンダリングモード

6つある

f:id:bibinbaleo:20200421153136p:plain

f:id:bibinbaleo:20200421153202p:plain

 

Opaque (デフォルト)透明な領域がない通常のソリッドオブジェクトに適しています。  
Cutout 不透明な領域と透明な領域の間にハードエッジを持つ透明な効果を作成できます。このモードでは、半透明の領域はなく、テクスチャは100%不透明または不可視です。これは、透明度を使用して、植生などのマテリアルの形状を作成するときに役立ちます。  
Fade 透明度の値を使用して、オブジェクトのスペキュラハイライトや反射など、オブジェクトを完全にフェードアウトできます。このモードは、オブジェクトがフェードインまたはフェードアウトするアニメーションを作成する場合に役立ちます。反射やハイライトもフェードアウトするため、透明なプラスチックやガラスなどのリアルな透明マテリアルのレンダリングには適していません。  
Transparent 透明なプラスチックやガラスなどのリアルな透明素材のレンダリングに適しています。このモードでは、マテリアル自体が(テクスチャのアルファチャネルとティントカラーのアルファに基づいて)透明度の値を取ります。ただし、実際の透明なマテリアルの場合と同様に、反射と照明のハイライトは完全に明瞭に表示されます。  
Additive 前のピクセルカラーと現在のピクセルカラーを合計する加算ブレンドモードを有効にします。これは、透明度の並べ替えの問題を回避するために推奨される透明度モードです。  
Custom レンダリングモードのあらゆる側面を手動で制御できます。高度な使用のみ。

 

Cull Mode

f:id:bibinbaleo:20200421154938p:plain

基本的にBackにするのかな?両面必要な場合はOff。後ろ側だけ見せたいときがfront?

Off フェイスカリングを無効にします。カリングは、両面メッシュが必要な場合にのみオフに設定する必要があります。
Front 前面カリングを有効にします。
Back (デフォルト)背面カリングを有効にしますレンダリングのパフォーマンスを向上させるには、できるだけ頻繁に背面カリングを有効にする必要があります。

パフォーマンスとライティング

MRTKシェーダーのほうがパフォーマンスめっちゃいいよ!

ライトは正確に計算するのではなく疑似的に使用しているので軽いよ

・Directional Light

シーン内の最初のUnity Directional Light(有効な場合)の方向、色、強度を考慮。動的ポイントライト、スポットライト、またはその他のユニティライトは、リアルタイムライティングでは考慮されません。

・球面調和関数

シェーダーは、有効になっている場合、球面プローブを使用してシーン内のライトを近似するためにライトプローブを使用します。球面調和関数の計算は、計算コストを削減するために頂点ごとに実行されます。

LWRP

LWRPに対応している。

メニューからアップグレードしたらマテリアルのエラーが消える

f:id:bibinbaleo:20200421161204p:plain

uGUI

MRTK標準のシェーディングシステムはUnityの内蔵UIシステムと連動します。Unity UIコンポーネントでは、unity_ObjectToWorld行列は、Graphicコンポーネントが住んでいるローカルトランスフォームの変換行列ではなく、その親Canvasの変換行列となります。多くのMRTK/Standardシェーダ効果では、オブジェクトのスケールを知る必要があります。この問題を解決するために、ScaleMeshEffect.csは、UIメッシュの構築中にUVチャンネルのアトリビュートにスケーリング情報を格納します。

余計なSourceImageは消したほうがいい。

f:id:bibinbaleo:20200421162130p:plain

輪郭

f:id:bibinbaleo:20200421163234p:plain

スクリプトでつけている。

MeshOutline.csをつけて輪郭用のマテリアルをセットする。

f:id:bibinbaleo:20200421163610p:plain

複数オブジェクトをまとめて付けたいときは、親にMeshutlineHierarchy.csをつけると、Unity

f:id:bibinbaleo:20200421163554p:plain

Input overview

microsoft.github.io

 

f:id:bibinbaleo:20200423102159p:plain

f:id:bibinbaleo:20200423102202p:plain


InputDeviceの切り替わりは自動で検知される(WinMRのコントローラーやゲームパッドなど)

microsoft.github.io

入力イベントの取り方にはいろいろある。

バイスに依存しない処理はPointerイベント

microsoft.github.io

MRTKにはデバイスに依存しない方法で入力状態を直接問い合わせるための便利なメソッドがいくつか用意されています

microsoft.github.io

こっちは依存する

microsoft.github.io

 デバイスのメッシュオブザーバーの構成

microsoft.github.io

空間メッシュの設定???MRTKのSpatialAwareness設定

f:id:bibinbaleo:20200423163405p:plain

GeneralSetting

自動で実行するか。update間隔は一般的な値は、0.1〜5.0秒の範囲

f:id:bibinbaleo:20200423163743p:plain

オブザーバーの形状

f:id:bibinbaleo:20200423164054p:plain

Physics Settings

Unityにレイヤー作ってるよ!

f:id:bibinbaleo:20200423163746p:plain

空間メッシュデータの詳細さ

f:id:bibinbaleo:20200423163749p:plain

  • Coarse -アプリケーションのパフォーマンスへの影響が小さく、ナビゲーション/飛行機の検索に最適です。

  • Medium -大規模なフィーチャ、床と壁、およびオクルージョンの詳細の両方について環境を継続的にスキャンするエクスペリエンスに役立つバランスの取れた設定。

  • Fine-一般に、アプリケーションのパフォーマンスへの影響が大きいため、オクルージョンメッシュに最適です。

  • Custom -アプリケーションがTriangles / Cubic Meterプロパティを指定する必要があり、アプリケーションが空間メッシュオブザーバーの精度とパフォーマンスへの影響を調整できるようにします。

DisplaySettings

f:id:bibinbaleo:20200423165114p:plain

ユーザーが空間メッシュを見えるようにするか

None - オブザーバはメッシュをレンダリングしません。
Visible - メッシュデータは、可視マテリアルを使用して可視化されます。
Occlusion - メッシュデータはオクルージョンマテリアルを使用してシーン内のアイテムをオクルードします。

デフォルトでVisibleになってたけど、表示されてないよ??