デコシノニッキ

ホロレンジャーの戦いの記録

HoloLensで片目しか描画されないとき

観測範囲内でこの現象にハマる人が多いようです

結論から言うと、 Single Pass Instancing に対応していない Shader をつかっているがためです.

Single Pass Instancing とは?

Single Pass Instancing とは、左右それぞれのディスプレイに効率よくレンダリングする技術の1つです。Multi Pass に比べ、パフォーマンスが良いのが利点です。仕組みをより詳しく知りたい方は、下記のリンク先がオススメです。

tips.hecomi.com

f:id:haikage1755:20200814213958p:plain:w450

Unity では、XR Settings -> Stereo Rendering Modeレンダリング手法を切り替えることができます。MRTKでは気を利かせてダイアログで有効にしてくれているので、気づかない人も多いのかな?という印象です。

f:id:haikage1755:20200814215635p:plain:w450
MRTKの設定

Single Pass Instancing と Shader

先の記事内でも紹介されているように、Single Pass Instancing を使う場合は、対応するShaderを用意する必要 があります。購入したアセットがSingle Pass Instancing に対応していなかったり、UnityChanShaderを使うと、記事の題名のようにHoloLensで片目しか表示されないということになってしまいます。

HoloLens のシングルパスステレオレンダリング - Unity マニュアル

MRTK のShaderは、Single Pass Instancing に対応しているので問題なく利用できます。

MRTKの解説

さらっと書きましたがMRTKではこの辺りをもう少し詳しく書いてあるので、興味がある人は読んでみるとよいでしょう。

Performance | Mixed Reality Toolkit Documentation

UnityのXRのデフォルトのレンダリング設定は、マルチパスです。この設定では、Unity がレンダリング パイプライン全体を 2 回、各アイに対して 1 回実行するように指示します。これは、代わりにシングルパス インスタンスレンダリングを選択することで最適化することができます。この設定では、レンダーターゲットの配列を利用して、各アイに適したレンダーターゲットにインスタンス化する1回の描画呼び出しを実行できるようにします。さらに、このモードでは、すべてのレンダリングレンダリング パイプラインの 1 回の実行で行うことができます。このように、ミックスリアリティアプリケーションのレンダリングパスとしてシングルパスインスタンスレンダリングを選択すると、CPUとGPUの両方で大幅に時間を節約することができ、推奨されるレンダリング構成となります。

しかし、各メッシュに対して各目に単一の描画コールを発行するためには、すべてのシェーダでGPUインスタンス化がサポートされている必要があります。インスタンス化により、GPUは両目にまたがって描画コールを多重化することができます。UnityのビルトインシェーダとMRTKスタンダードシェーダはデフォルトではシェーダコードに必要なインスタンシング命令が含まれています。ただし、Unity用にカスタムシェーダーを書く場合は、これらのシェーダーを更新してシングルパスのイン スタンスレンダリングをサポートする必要があるかもしれません。 www.DeepL.com/Translator(無料版)で翻訳しました。

まとめ

  • Single Pass Instancing を使いたい場合は、MRTKのStandardShaderを使う、あるいはShaderを Single Pass Instancingに対応させる
  • ShaderのSingle Pass Instancing 対応がどうしても困難な場合は、パフォーマンスを諦めて Multi Pass を使う

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」