ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
空間コンピューティングにおけるレンダリングの詳細
RealityKitレンダリングでvision OSにおけるアプリとゲームの外観や感触を向上させましょう。コンテンツの照明をカスタマイズし、grounding shadowsを足し、tone mappingを制御する方法を学びます。またこのプラットフォームにおける2つの鍵となる処置のベストプラクティス"rasterization rate maps"と"dynamic content scaling"をご紹介します。
関連する章
- 0:00 - Introduction
- 1:15 - Lighting and shadows
- 5:05 - Materials
- 10:09 - Rasterization rate maps
- 13:13 - Dynamic content scaling
- 16:01 - Wrap-up
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪ ♪ こんにちは! RealityKitチームのエンジニアのIvaです ようこそ 「Explore rendering for spatial computing」へ RealityKitは3Dモデルの レンダリングやアニメーション シミュレーションのフレームワークです RealityKitの強力な特徴の一つが コンテンツへのリアルな レンダリングの適用です RealityKitのレンダリング能力を活用し コンテンツの見た目を充実させるため 空間コンピューティングのための アプリ開発において レンダリングにおける考慮点を シェアしたいと思います まず3Dコンテンツの lightingとshadowsからです そして新しいRealityKit materialsについて 次にシステム性能を向上させる rasterization rate mapsをご紹介し この最適化にコンテンツが適応するよう どう調整すべきかについて説明します 最後にインターフェイスを 常に鮮明にさせる dynamic content scalingをご紹介します まずはlightingとshadowsからです もしiOSとmacOSのRealityKitを 熟知しているなら ほとんどの知識が 空間体験の構築にも当てはまります コンテンツをリアルに見せる image-based lightingが RealityKitに登場しました Image-based lighting及びIBLは 右側のようなテクスチャーで リアルな反射を作り出します Shadowsはobjectsがお互い どのような位置かを理解させてくれます 新機能を見る前に image-based lightingの 構成要素を見てみましょう IBLには2つの主要要素があります ARKitに供給され部屋の物理空間に特有の Environment probe textureと OSに含まれるsystem IBL textureです System IBL textureは コンテンツがどの環境でも よく見えるようhighlightsを加えます これらの要素が足され combined IBL textureになります 環境がアクティブなら combined IBL textureにも影響があります 今年からRealityKitに lightingのカスタマイズのため system IBL textureを オーバーライドできるようになります では例を見てみましょう これは「Hello World」という 太陽系を探検できるものです デフォルトではRealityKitが system IBLで灯りを照らします しかし新しいIBLを 新しいIBL componentに適用すれば system IBLに変わり surrounding immersive environmentで objectsを照らします その過程をお見せしましょう まず3Dコンテンツを読み込みます この場合 衛星モデルです 次にSunlightという 環境リソースを読み込みます 地球を取り囲む太陽と 星々のイメージが含まれています モデルと環境リソースの両方に IBLの設定が必要ですので 読み込みが完了するのを待ちます 次にImageBasedLightComponentを足します 今読み込んだ環境リソースを参照します 最後にImageBasedLightReceiverComponentを 衛星に足します これらのreceiver componentsを ほかのものにも足し同じIBLを使って 照らすことができます このようにRealityKitでは簡単に lightingをカスタマイズできます 次にどうやってshadowsを足すか 見てみましょう ではこのような3Dの花瓶を宙の平面に置く 簡単な例を見てみましょう Shadowsがオフの状態では 花瓶と平面の位置関係がわかりません しかしRealityKitの grounding shadowを足せば 花瓶が平面中央の 上にあることがわかります ではこれをコードで見てみましょう まず花瓶のモデルを読み込みます ここではflower_tulipがこのプロジェクトの 3Dモデルの名前です 次にgrounding shadow componentを足します castsShadow flagをtrueに設定します それだけです! これで花瓶にgrounding shadowsができます 簡単でしょう? Grounding shadowsは3Dモデルと 物理的環境の上に現れます シーンの照明にcustom IBLを使い grounding shadowsを足すことで objectsのルックスがよくなりますが materialsの調整で直接objectsに 手をつけることもできます macOSとiOSで利用できる たいていのRealityKit materialsは xrOSでも利用できます それらを見てみましょう よく使用されるmaterialは PhysicallyBasedMaterialです RealityKitのPhysicallyBasedMaterialは 光に反応しプラスチックやメタルなど 様々な実世界のmaterialsを 描写することができます SimpleMaterialも光に反応しますが 小さいパラメータの部分集合を使用します 簡潔な実験に向いています UnlitMaterialは光に反応しません つまり光の状況が変わっても 一定のルックスを維持します VideoMaterialはUnlitMaterialの変種で その表面にmovie fileをマップできます これらのmaterialsに加えRealityKitに 新しくShaderGraphMaterialが加わります 新しいShaderGraphMaterialは Reality Composer Proで作成するか MaterialXファイルから読み込めます ShaderGraphMaterialについて 詳しくは 「Explore materials in Reality Composer Pro」をご覧ください すべてのmaterialsのcolor outputは tone mappingという 特別のステップを通します Tone mappingはmaterialsのcolor outputsに デフォルトとしてRealityKitが適応する transformationです 数々のテクニックを使い より自然な色を可能にします その一つが1以上の値をvisible rangeに リマッピングします 例を使って見てみましょう ここにtone mappingをオフにした TVの3Dレンダーがあります 画面に非常に明るいtextureを適用しました ここでtone mappingをonにすれば これらの花びらのように 明るい部分の詳細が鮮明になります Tone mappingは通常問題なく 美しくレンダリングしますが場合によって objectの実際の色を表示したい場合は tone mappingを オプトアウトせねばなりません 例を見てみましょう ここに信号機を示す簡単なアプリがあり 「Stop」「Wait」「Go」の ラベルのボタンがあります 信号機自体は3Dモデルで ボタンはSwiftUIで追加されました ランプとボタンの色をマッチさせるため ランプにunlit materialを使用します これはunlit materialsは 照明の状況に関わらず ルックスを一定に保つからです しかしunlit materialのoutputは まだtone mappingに影響されます RealityKit materialsに対し デフォルトでオンだからです ですのでSwiftUIボタンと ランプのmaterialに 同じ色が適用されても 少し違って見えるかもしれません このイメージは tone mappingがオンの状態で ランプのmaterialに tone mappingをオフにした場合を お見せします ランプとボタンの色が 正確にマッチしました もう一度ランプmaterialの tone mappingをトグルします これがtone mappingがオンの状態 これがオフの場合です ではコードサンプルで tone mappingをコードで トグルする方法を見てみます まず信号機モデルを読み込みます このプロジェクトではtraffic_lightが 信号機の3Dモデルです 次にred_lightというentityを探します このentityは信号機の一番上のランプです いざentityが見つかれば model componentにアクセスします 次に新しいunlit materialを作ります 希望する色と applyPostProcessToneMapという 新しいBoolean parameterをパスします Tone mappingをオフにするため このBoolean parameterを falseに設定します 最後にmodel componentの materialを取り換え model componentを entityに当て直します ランプそれぞれに行います これでボタンとランプの色が マッチするはずです applyPostProcessToneMap flagを シーンでの実際の色の表示に 使用できます これはRealityKitでメニューや ヘッドアップ表示の作成に役立ちます この新しいpropertyはまた Reality Composer Proの material editorでも表されます 次は質について見てみましょう まず空間コンピューティングの rasterization rate mapsからです ヘッドセットの画面は高画質で OSは1秒に何度も画面を 更新せねばなりません 絵を使って説明します 既にご存知の通りヘッドセットは どこに視線が向いているかを 感知することができます これはこの人物が 目を右に動かし中央に戻した場合の シミュレーションです 黄色い円は焦点の中央を 示しています その周辺がglowでハイライトされ その周りは暗くなっています Rasterization rate mapは 暗くなったエリアでの 計算を少なくします ご覧のように常に ハイライトされたエリアは その周辺より小さいエリアです これによりシステムは メモリと性能の削減を実現できます RealityKitでは この最適化が自動的に行われます システム性能が大幅に向上しますが 場合によってはコンテンツを調整し 最適化がうまくいくようせねばなりません 例えばここにシュロの葉の アセットがあります 画面中央に置くと 鮮明に詳細が見えます しかし左側に動かし 先程の目の動きを実行すると シュロの葉がチラチラします このチラチラは 視線を示す黄色い円が画面の右端に寄ると 非常に激しくなります このチラチラは rasterization rate mapにより 視点の焦点周辺を 高画質でレンダーし 視点が遠ざかるためシュロの葉の周辺を 低画質でレンダーするために生じます このチラチラは コンテンツのパラメータを 調整すれば少なくなります それを見てみましょう 先程のシュロの葉のアセットに 赤のwireframe overlayを乗せています たくさんの小さい三角形があります 周囲でチラチラするのは この三角形のためです この三角形を大きくし 詳細をopacity textureに保存することで チラチラを減らすことができます アセットの調整後のシミュレーションです 調整後のモデルはよくなりました これはアセットが読み込まれる時 RealityKitが低画質のopacity mapを 自動的に生成するためです 低画質版のtextureは mipmapsと呼ばれ低画質エリアのルックスを 向上させるため GPUが自動的にこれを使用します Rasterization rate mapsの詳細は documentationである 「Rendering at Different Rasterization Rates」をお読みください Rasterization rate mapsに似た dynamic content scalingと 呼ばれるテクニックがあり これはSwiftUIで書かれたコンテンツの ルックスを自動的に向上させます では見てみましょう ここに基盤上に月々をリストで記した アプリがあります 各月はテキストラベルで示されています 視点がJuneに行くと システムはその周辺のテキストを 最高レベルの詳細でラスター化します Juneの周辺の青いエリアは やや詳細が減少したレベルで ラスター化されますが まだ高画質を保っています しかし紫で示されたエリアは 人間の視覚システムが周辺では 詳細を捉えず目立たないため かなり詳細が落ちたレベルでラスター 化されます 見ているものにより詳細度が変わる ラスタライゼーションを dynamic content scalingと呼びます コンテンツを正しいスケールで描くため dynamic content scalingで システムは鮮明さを保ちます Dynamic content scalingは ラスター化された コンテンツに比例するメモリに影響します つまりどこを見ているかによって テキストラベルは違ったサイズに スケーリングされるということです 例えばここにあるJuneのラベルは 一番大きく 最も多くの画質と詳細を持っています その周りの8つの月 JanuaryやFebruaryなどは 詳細が少し欠けています 最後に3つの月 AprilとAugustとDecemberは 視点から最も遠くにあります このグループはメモリに 最も小さいイメージで 描かれます ではdynamic content scalingを どう作動させるか見てみましょう UIKitとSwiftUIを使用しているなら あなたのアプリは自動的に このテクニックを使用します もしCore Animation frameworkを 使用しているなら dynamic content scalingを作動させる 新しいAPIがあります このAPIを見てみましょう Dynamic content scalingは CALayerのプロパティを wantsDynamicContentScalingで trueにして設定します このテクニックは高画質でのラスター化に 依拠するのでbitmapベースの コンテンツへの使用はお勧めできません Dynamic content scalingの お勧めリストは developer.apple.comにあります それではおさらいです RealityKitアプリに image-based lightsと grounding shadowsを 加える方法を学びました そしてShaderGraphMaterialなど 空間体験に利用できる materialsをレビューしました またunlit materialsにおける tone mappingの調整について学びました 次にrasterization rate mapsが 空間コンピューティングで どう使用されるか学び 視界周辺での3Dモデルの チラチラを減らす方法も検証しました 最後にdynamic content scalingと その使い方を学びました 今年のリリースを使ってみなさんがxrOSで どのような美しい空間体験を作るか 楽しみにしています ありがとう ♪
-
-
3:05 - Image based lighting
RealityView { content in async let satellite = Entity(named: "Satellite", in: worldAssetsBundle) async let environment = EnvironmentResource(named: "Sunlight") if let satellite = try? await satellite, let environment = try? await environment { content.add(satellite) satellite.components.set(ImageBasedLightComponent( source: .single(environment))) satellite.components.set(ImageBasedLightReceiverComponent( imageBasedLight: satellite)) } }
-
4:28 - Grounding shadows
RealityView { content in if let vase = try? await Entity(named: "flower_tulip") { content.add(vase) vase.components.set(GroundingShadowComponent(castsShadow: true)) } }
-
8:48 - Disable tone mapping
RealityView { content in if let trafficLight = try? await Entity(named: "traffic_light") { content.add(trafficLight) if let lamp = trafficLight.findEntity(named: "red_light") { if var model = lamp.components[ModelComponent.self] { let material = UnlitMaterial(color: .init(color), applyPostProcessToneMap: false) model.materials = [material] lamp.components[ModelComponent.self] = model } } } }
-
15:34 - Dynamic content scaling
// Enable dynamic content scaling on CALayer with: var wantsDynamicContentScaling: Bool { get set }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。