Slide 1

Slide 1 text

Tokyo HoloLens Meet up vol.21 HoloLensアプリ開発中級編︖ Hologram Stabilizationに気をつけよう (2020年版) HoloLab Inc. 1

Slide 2

Slide 2 text

⾃⼰紹介 decoc (@deco_c_) 所属︓株式会社ホロラボ 何している⼈︖︓⼤体HoloLens以外のこと やってます HoloLab Inc. 2

Slide 3

Slide 3 text

今⽇のテーマ 過去のLTのリファイメント 内容はブログで公開しているものをより詳細にブレークダウン 地味だけど⼤切な話 ※ この話はレンダリングの話を含みます. 何か間違っているなどあれ ば優しくマサカリを投げてください HoloLab Inc. 3

Slide 4

Slide 4 text

話の構成 HoloLab Inc. 4

Slide 5

Slide 5 text

たぶんよく⾒る光景 上: Editorで⾒た時 下: 実機で⾒た時 実機で⾒ると描画が歪むなぁ... HoloLab Inc. 5

Slide 6

Slide 6 text

どうして︖ Reprojection の性質を理解して、適切に使われていないため バグではないよ︕ HoloLab Inc. 6

Slide 7

Slide 7 text

Reprojection (再投影)で描画補正 Late Stage Reprojection (LSR) は、ユーザーが移動したときにホ ログラムを安定化するのに役⽴つハードウェア機能です。 Late Stage Reprojection(AzureRemoteRendering) “ “ At the end of rendering a frame, the Windows Mixed Reality platform takes the color & depth render targets produced by the application and transforms the final screen output to account for any slight head movement since the last head pose prediction. Late-stage reprojection(MRTK) “ “ HoloLab Inc. 7

Slide 8

Slide 8 text

Late-stage reprojection フレームのレンダリングの最後に、 ⾊ と 深度 を受け取って、頭部姿勢 の予測から最終的なレンダリング結果を補正する仕組み HoloLab Inc. 8

Slide 9

Slide 9 text

予備知識︓レンダリングの流れ 座標変換 3D空間上の頂点情報を、描画するための座標系に変換する HoloLab Inc. 9

Slide 10

Slide 10 text

予備知識︓レンダリングの流れ ラスタライズ 頂点情報から、ディスプレイ上のどのピクセルに描画すればよいのか を計算して画素を⽣成する HoloLab Inc. 10

Slide 11

Slide 11 text

予備知識︓レンダリングの流れ 深度バッファ 画⾯描画の際に前後判定を⾏うために 深度値(depth) を使う 奥⾏きを表現する深度値は、0~1で表される HoloLab Inc. 11

Slide 12

Slide 12 text

予備知識︓レンダリングの流れ 深度テスト 深度値が浅いものから描画される HoloLab Inc. 12

Slide 13

Slide 13 text

Enable Depth buffer Sharing おまじないのようにチェックしていた アイツ 予備知識で触れた深度値を描画補正に 使ってもいいよという許可を与えてい る HoloLab Inc. 13

Slide 14

Slide 14 text

Depth formt bit数に応じて深度値の 分割数 が変わる 16bitか24bitを選択できる 16bit -> 1/2^16 = 1.525e-5 24bit -> 1/2^24 = 5.960e-8 HoloLab Inc. 14

Slide 15

Slide 15 text

Depth format の選択 MRTKのドキュメントでは、推奨は16bit 分割が細ければそれだけ深度の精度がよくなる z-fightingの発⽣しにくくできる 分割が細かい程処理負荷は増す 16bitでは、ステンシルバッファが使えない UI Mask が機能しないので要注意 (スクロールUIなど) HoloLab Inc. 15

Slide 16

Slide 16 text

Z-Fighting Z値が、同値をとったときに描画が競合する現 象 回避するには、深度値の精度を上げるか、オ ブジェクトの位置をずらす必要がある 深度値の精度をあげるには、 DepthFormatを24bitにする カメラのNear/Farの間を狭くする HoloLab Inc. 16

Slide 17

Slide 17 text

Depth format を 16bitにした際のステンシル の挙動 HoloLab Inc. 17

Slide 18

Slide 18 text

Depth format を 16bitにした際のMaskの対策 Unityの Mask Component はステンシルが使われている 16bitでもMaskがしたい時は、 Rect Mask2D を使おう ただし、Rect Mask2D は矩形マスクしかできないことに注意 HoloLab Inc. 18

Slide 19

Slide 19 text

Reprojectionの種類 以下の2種類に⼤別されます. Planer Reprojection Manual Planer Reprojection (便宜上) Automatic Planer Reprojection Depth Reprojection HoloLab Inc. 19

Slide 20

Slide 20 text

Planer Reprojection (平⾯再投影) Stabilization Plane と呼ばれる平⾯上にあるオブジェクトの描画を補 正する⼿法 HoloLab Inc. 20

Slide 21

Slide 21 text

Planer Reprojectionの種類 コンテンツ上に平⾯を置く2つの⼿法 Manual Planer Reprojection 平⾯の位置と姿勢を SetFocusPointForFrame を使って指定する 平⾯の位置は Colliderにヒットした場所 に置く場合が主 HoloLens (gen 1) 初期では主にこの⼿法が取られていた Automatic Planer Reprojection 深度値 を使って⾃動で平⾯を合わせる HoloLens (gen 1) 後期から推奨されるようになった HoloLab Inc. 21

Slide 22

Slide 22 text

Planer Reprojectionのイメ ージ ⾒ている対象の位置に合わせ て平⾯が移動する HoloLab Inc. 22

Slide 23

Slide 23 text

Depth Reprojection ピクセル単位の深度値を使って描画を補正する Automatic Planer Reprojectionとは違い、平⾯は登場しない (ややこしいポイント) HoloLab Inc. 23

Slide 24

Slide 24 text

どのReprojectionが採⽤されている︖ アプリでどのReprojectionが採⽤されているかは、DevicePortalの機 能を使って確認できる View->HologramStabilitry, Show depth or plane in headset HoloLab Inc. 24

Slide 25

Slide 25 text

Planer Reprojection ⻘い格⼦上の平⾯が空間に描画される HoloLensのチュートリアルアプリで は、Planer Reprojectionが採⽤されて いる HoloLab Inc. 25

Slide 26

Slide 26 text

Depth Reprojection 深度値が書き込まれているところが⻘ く描画される HoloLensのホーム画⾯(?)では、Depth Reprojectionが採⽤されている HoloLab Inc. 26

Slide 27

Slide 27 text

MRTKで Reprojection⼿法を 選択する Profileから簡単に切り替えることがで きる CameraSystemProfile- >CameraSettingProfile- >DepthReprojectionSetting HoloLab Inc. 27

Slide 28

Slide 28 text

Reprojection⼿法の選択 それぞれのReprojectionは残念ながら共存できない 特性を把握してプロジェクトでどちらを採⽤するか考える必要があ る 推奨は、Depth Reprojection プロジェクトのデフォルトも Depth Reprojection ただし、Depthを扱う場合は注意点がある HoloLab Inc. 28

Slide 29

Slide 29 text

DepthReprojectionを使うときの注意 当然、 深度値 が書き込まれていないものにこの⼿法は通じない 何か描画が歪むと⾔っている⼈がいたらだいたい原因はコレ 下記の2つは深度値の書き込みを⾏っていない Unity標準UIコンポーネント 半透明オブジェクト HoloLab Inc. 29

Slide 30

Slide 30 text

Unity標準UIコンポーネント ZWrite Off となっている UIは常に最前⾯にくるので、階層順で描画すればいい そのため深度値を書き込む必要がない Shader "GUI/Text Shader" { ... Lighting Off Cull Off ZTest Always ZWrite Off Blend SrcAlpha OneMinusSrcAlpha ... HoloLab Inc. 30

Slide 31

Slide 31 text

半透明オブジェクト Zテストは、「奥のオブジェクトは⼿前のオブジェクトで隠れてい る」ようにするため、「奥のオブジェクトが⾒えて欲しい」という半 透明とは相性が悪い そのため、UnityではDepthを使わず RenderQueue を使った描画順序指 定を⾏っている HoloLab Inc. 31

Slide 32

Slide 32 text

Depthを可視化して確認する (実機) 深度値の書き込み ⻘: 有り, ⾚: 無し UI部分が⾚⾊で描画されている HoloLab Inc. 32

Slide 33

Slide 33 text

Depthを可視化して確認する (MRTK) MRTKではDepthが書き込まれている か否かを確認する機能がある MRTKのDefaultProfileの Editor-> Render Depth Buffer HoloLab Inc. 33

Slide 34

Slide 34 text

Depthを可視化して確認する (MRTK) Cube: 深度値書き込み有り Text: 深度値書き込みなし ⿊く表⽰されている箇所: 深度値書 き込み有り ⽩く表⽰されている箇所: 深度値書 き込みなし HoloLab Inc. 34

Slide 35

Slide 35 text

回避策1︓Planer Reprojectionを使う SetFocusPlaneを使った配置になる (勿論depthを使わない⽅) カメラから常にコンテンツが等距離である EX)チュートリアルアプリ あるいは、 コンテンツにコライダーが設定されている 安パイ HoloLab Inc. 35

Slide 36

Slide 36 text

回避策2︓Depthを書き込むようにする ⾃作Shaderで深度値を書き込む場合は、ZWriteをOnにすればいい Shader "Custom/MyShader" { SubShader { Pass { ... ZWrite On ... } } } HoloLab Inc. 36

Slide 37

Slide 37 text

回避策2︓Depthを書き込むようにする(MRTK) MRTKのStandardShaderを使ってtransparentを指定した場合は、サ ジェスチョンが表⽰される HoloLab Inc. 37

Slide 38

Slide 38 text

Depthを書き込めばいい という話ではない 深度値を書き込むことで、奥が描画が されたりされなかったりということが 発⽣しうる 上: 深度値書き込みなし 下: 深度値書き込みあり HoloLab Inc. 38

Slide 39

Slide 39 text

回避策3: Depth書き込みしたものを背⾯に置く UnityUIを使⽤している場合は、他のオブジェクトの深度値を利⽤す るという⼿がとれる. If the above methods do not work for a given scenario (i.e using Unity UI), it is possible to have another object write to the depth buffer. A common example is using Unity UI Text on a floating panel in a scene. By making the panel opaque or at least writing to depth, then both the text & the panel will be stabilized by the platform since their z-values are so close to each other. “ “ HoloLab Inc. 39

Slide 40

Slide 40 text

MRTKのボタンの場合 MRTKのボタンでは、Opaqueのパネ ルと組み合わせてこれを回避している HoloLab Inc. 40

Slide 41

Slide 41 text

2つのオブジェクトが⼗分 に近ければ、深度値を同 じと⾒做してくれる ex) 深度値がない⽂字に対して、深度 値書き込みをしたプレーンを組み合わ せる. 画像の値はイメージ HoloLab Inc. 41

Slide 42

Slide 42 text

実際に計算する PressableButtonが(0,0,2)、カメラのNear/Farが0.1/1000とする バックプレートの奥⾏き: 2.008e-3 ⽂字の奥⾏き: 2.0e-3 深度値のフォーマット︓16bit -> 1.525e-5, 24bit -> 5.960e-8 バックプレートと⽂字の深度値の差は、8.0e-6 16bitでは同値と⾒做せるが、24bitでは同値ではない ※ これは例なので実際どうなっているかは不明だが、ある程度深度値 が近ければ補正が有効になるようである HoloLab Inc. 42

Slide 43

Slide 43 text

まとめ Depth Reprojectionは、HoloLensが動いても描画を綺麗に⾒せるた めに有効な⼿法 但し、前提知識を踏まえよく考えて使わないとかえって逆効果にな る HoloLab Inc. 43