WWDC Quick Look 💓 By SwiftGGTeam
Optimize your custom environments for visionOS

Optimize your custom environments for visionOS

元の動画を見る

ハイライト

本 Session は月面環境を事例に、3D 環境の最適化フローを一通り解説しています。1 億ポリゴン以上のプレレンダリング品質のアセットから始め、幾何学的最適化(アダプティブ減面、遠景の Billboard 置き換え、オクルージョンカリング)、UV 投影(多視点球面投影 + スクリーンスペース texel 密度配分)、テクスチャベイク(球面レンダリング + サーフェス直接投影)の 3 段階を経て、最終的に 18 万ポリゴン、250 MB のテクスチャメモリ、100 draw call 以内に圧縮しました。


主要内容

visionOS のイマーシブ環境を構築する際、最大の課題は「映画級の画質」と「リアルタイムレンダリングの予算」の間にある隔たりです。月面のデモシーンでは、プレレンダリング版が 1 億以上の三角形と数十 GB の PBR マップ、path-traced ライティングを抱えており、これをそのまま Vision Pro に持ち込んでも動作しません。視点を変えてみましょう。ユーザは Immersive Boundary(イマーシブ境界)に制限されて数メートル以内でしか動けないため、「ユーザに見える部分」だけをきちんとレンダリングすれば十分です。見えない部分、見えにくい部分はすべて削り落とせます。

今回 Apple はそのツールチェーン一式を公開しました。Alex(Apple Technical Artist)が 14 個の Houdini Digital Asset(HDA)をリリースしました。いずれもプロシージャルノードで構築されており、ダウンロード・再利用・設定変更が可能です。Session では月面シーンをサンプルとして、「幾何最適化 → UV 投影 → テクスチャベイク → USD 階層」の 4 ステップを完了させ、最終的に 18 万三角形、250 MB テクスチャ、単フレーム 100 draw call 以下に収めました。フロー全体の核心思想は一言でまとめられます。Immersive Boundary 上のサンプリングポイントを基準とし、すべての最適化は「ユーザ視点から何が見えるか」という観点から行う。


詳細

1. Immersive Boundary は最適化の出発点(04:39

Vision Pro のフルイマージョンでは、ユーザは数メートル範囲内を自由に移動でき、範囲を超えると画面がフェードアウトします。この境界がレンダリング予算の根拠となります。Boundary Camera HDA はシーン内に複数の仮想カメラを配置し、いつでも「ユーザ視点」に切り替えて効果を確認できます。Boundary Samples HDA は境界内にサンプリングポイントを生成し、これを後続のすべての幾何/UV/カリングツールの入力とします。

重要ポイント:

  • フルイマージョンではすべてのピクセルをレンダリングする必要があり、mixed immersion よりはるかに高コストです。予算は慎重に配分する必要があります。
  • ほとんどすべての HDA はサンプルポイントのセットを入力として受け取ります。多視点評価により、単一視点が引き起こす不具合を回避します。
  • サンプリングポイントが多いほど精度は高まりますが、計算時間も比例して増加します。まず少なめに設定し、後から増やして反復改善します。

2. 3 段階の幾何最適化:アダプティブ減面 + Billboard + オクルージョンカリング

Adaptive Reduce HDA09:52):Houdini ネイティブの PolyReduce をベースにしていますが、Boundary Samples の位置を読み取り、「どの三角形がシルエットに大きく寄与するか」を基準に残す三角形を決定します。silhouette パラメータでシルエットエッジの密度ウェイトを制御し、distance weighting で遠方の減衰を制御します。月面シーンでは、2,200 万ポリゴンの岩を 1 つの HDA で圧縮しました。

Vista Billboard HDA12:54):1 km 先の物体は、深度視差がほとんど知覚できないため、直接 Billboard に置き換えます。ゲームで一般的な透明スプライトとは異なり、このツールは ray cast を使って実際の頂点を球面/円柱面に投影し、再三角化することで、リアルなシルエットを持つ扁平なジオメトリを生成します。透明マテリアルのオーバーヘッドはありません。月面の遠景は数百万ポリゴンから数千ポリゴンに削減されました。

Occlusion Culling HDA14:48):各サンプリングポイントから数百万本の ray を四方に発射し、ヒットした三角形は残し、ヒットしなかったものは削除します。Backface Removal(dot product で境界に対して常に背を向ける面を判定)と組み合わせて実行します。月面シーンでは Backface で 6 万ポリゴン、Occlusion でさらに 11 万ポリゴンを削減し、最終的に 35 万から 18 万ポリゴンに落としました。

3. スクリーンスペース UV:球面投影 + マルチパーティション(17:22

近距離(境界から 5 m 以内)は従来の area-based UV を継続使用し、texel 密度は表面積に応じて均等に配分します。境界外の遠景はアプローチを変えます。「ユーザの画面内でこの面がどれだけのピクセルを占めるか」に基づいて texel を配分します。これが spherical projection です。仮想球面をユーザの頭上に被せ、環境をその球面に投影し、UV とプレレンダリング画像に同じ投影パラメータを使用します。

単一球面投影では UV の折り返しや、遠方のテクスチャずれが発生します。解決策は 2 ステップに分かれています。

  • Mesh Partition HDA:メッシュをできるだけ少ない数の小片に分割し、各小片が少なくとも 1 つの角度から完全に見えることを保証します。「主役の岩」は表と裏に分けられ、それぞれ別々に投影されます。
  • Multi-Projection HDA:各パーティションに対して「画面内で最も大きく見える位置」を投影源として選び、すべてのパーティションの UV を個別に球面投影し、最後に 1 枚の atlas にパックします。

最終的に、月面環境全体は 2 枚のテクスチャだけで賄えます。境界内 1 枚(surface area スケーリング)、境界外 1 枚(screen space スケーリング)。サイズは近いものの、後者は数 km の範囲をカバーします。

4. ベイクと USD 階層(24:20

ベイクは 2 つの技術を組み合わせています。spherical render(単一視点からレンダリング結果を UV に投影)+ surface projection(ソースの高解像度モデルから最適化後の低解像度モデル UV に直接投影、ゲームの法線ベイクと同様)。前者はアーティスティックな意図を保持し、後者はカバレッジを保証します。最終的に unlit material として直接使用し、数十 GB のソーステクスチャを数百 MB に圧縮しました。

USD 部分では 2 つの HDA で空間分割を行います。Boundary Partition HDA が境界内の高密度ジオメトリを分割し、Frustum Partition HDA が境界外をスクリーン投影面積に応じてほぼ同じ大きさの tile に分割します。すべての分割は GeometrySubset として USD に書き込まれ、実行時に RealityKit/Unity が bounding box ベースで Frustum Culling を行い、視錐台外の subset を GPU から直接アンロードします。月面シーンでは、任意の時点で画面内のポリゴン数は 10 万未満、entity 数は 200 未満、単フレーム draw call は 100 未満です。


重要ポイント

  • やること:Immersive Boundary を「レンダリング予算の物理的基準」として扱い、すべての幾何学とテクスチャ密度をこの境界に基づいて減衰させる。

    • なぜ価値があるか:Vision Pro のフルイマージョンではすべてのピクセルをレンダリングする必要があり、予算は厳しい。Boundary は明確に定量化できる空間を提供し、「どこにリソースを投資すべきか」を計算可能にします。
    • どう始めるか:まず Apple の Immersive Optimization Toolkit(developer.apple.com/download/files/Immersive-Optimization-Toolkit.zip)をダウンロードし、Boundary Samples HDA でシーン内にサンプリングポイントを生成してから、Adaptive Reduce を接続して効果を確認します。
  • やること:遠景はすべて Billboard に置き換え、ただし実際の頂点投影法でシルエットを保持する。

    • なぜ価値があるか:1 km 先では人間の目は深度差をほとんど知覚できませんが、従来の透明 Billboard には alpha オーバーヘッドがあります。Vista Billboard HDA が生成するのはリアルなジオメトリシルエットで、透明マテリアルゼロ、深度違和感ゼロです。
    • どう始めるか:Vista Billboard HDA を Terrain ノード以降の遠景に適用し、距離閾値を 1 km から調整して、シルエットの損失が許容範囲かどうか確認します。
  • やること:UV は 2 セットに分ける。近距離は表面積ベース、遠距離はスクリーンスペースベース。

    • なぜ価値があるか:遠方の物体は画面内のピクセル数が少ないため、近距離と同じ texel 密度を与えるのは無駄です。スクリーンスペース配分により、km 級のシーン全体を 1 枚のテクスチャに収められます。
    • どう始めるか:Mesh Partition + Multi-Projection の 2 つの HDA を使用します。まず遠景を単一視点から完全に見える小片に分割し、次に多視点球面投影を行い、最後に Houdini の Layout/Pack で atlas にパックします。
  • やること:USD では GeometrySubset を使って明示的に分割し、RealityKit に Frustum Culling をさせる。

    • なぜ価値があるか:最適化後、シーン全体が 1 つの mesh にまとまることが多く、実行時に可視性に基づいてアンロードできません。subset で手動分割すると、bounding box が可視性判定の単位となります。
    • どう始めるか:Boundary Partition / Frustum Partition HDA で group 属性を書き出し、Solaris へのインポート時に Subset Groups を有効化し、グループ名を宣言するだけです。

関連セッション

コメント

GitHub Issues · utterances