TokyoHoloLensMeetUp_vol21.pdf

 TokyoHoloLensMeetUp_vol21.pdf

こちらのTokyoHoloLensMeetUp_vol21.pdfで登壇した内容です

https://hololens.connpass.com/event/181938/

Fa54d97af93719f9aa82873de3acb3b3?s=128

Shinya Tachihara

July 29, 2020
Tweet

Transcript

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

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

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

    3
  4. 話の構成 HoloLab Inc. 4

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

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

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

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

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

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

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

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

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

    1.525e-5 24bit -> 1/2^24 = 5.960e-8 HoloLab Inc. 14
  15. Depth format の選択 MRTKのドキュメントでは、推奨は16bit 分割が細ければそれだけ深度の精度がよくなる z-fightingの発⽣しにくくできる 分割が細かい程処理負荷は増す 16bitでは、ステンシルバッファが使えない UI Mask

    が機能しないので要注意 (スクロールUIなど) HoloLab Inc. 15
  16. Z-Fighting Z値が、同値をとったときに描画が競合する現 象 回避するには、深度値の精度を上げるか、オ ブジェクトの位置をずらす必要がある 深度値の精度をあげるには、 DepthFormatを24bitにする カメラのNear/Farの間を狭くする HoloLab Inc.

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

  18. Depth format を 16bitにした際のMaskの対策 Unityの Mask Component はステンシルが使われている 16bitでもMaskがしたい時は、 Rect

    Mask2D を使おう ただし、Rect Mask2D は矩形マスクしかできないことに注意 HoloLab Inc. 18
  19. Reprojectionの種類 以下の2種類に⼤別されます. Planer Reprojection Manual Planer Reprojection (便宜上) Automatic Planer

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

  21. Planer Reprojectionの種類 コンテンツ上に平⾯を置く2つの⼿法 Manual Planer Reprojection 平⾯の位置と姿勢を SetFocusPointForFrame を使って指定する 平⾯の位置は

    Colliderにヒットした場所 に置く場合が主 HoloLens (gen 1) 初期では主にこの⼿法が取られていた Automatic Planer Reprojection 深度値 を使って⾃動で平⾯を合わせる HoloLens (gen 1) 後期から推奨されるようになった HoloLab Inc. 21
  22. Planer Reprojectionのイメ ージ ⾒ている対象の位置に合わせ て平⾯が移動する HoloLab Inc. 22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Inc. 38
  39. 回避策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
  40. MRTKのボタンの場合 MRTKのボタンでは、Opaqueのパネ ルと組み合わせてこれを回避している HoloLab Inc. 40

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

    41
  42. 実際に計算する 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
  43. まとめ Depth Reprojectionは、HoloLensが動いても描画を綺麗に⾒せるた めに有効な⼿法 但し、前提知識を踏まえよく考えて使わないとかえって逆効果にな る HoloLab Inc. 43