ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
EDRによるHDRレンダリング
EDRはAppleのハイダイナミックレンジ表現とレンダリングパイプラインです。AppでEDRを使用してHDRコンテンツをレンダリングし、Appleの内蔵ディスプレイやPro Display XDRなどのHDRディスプレイのダイナミックレンジ性能を引き出す方法を紹介します。 ゲームやプロ向けAppのデベロッパが、macOSのネイティブEDR APIを活用して操作性をさらに向上させる方法や、HDRが適切かどうかの判断、トーンマッピングの適用、HDRコンテンツの配信に関するベストプラクティスを紹介します。
リソース
- Edit and play back HDR video with AVFoundation
- Editing and Playing HDR Video
- Export HDR media in your app using AVFoundation
- Metal
- Metal Shading Language Specification
- Processing HDR Images with Metal
関連ビデオ
WWDC23
Tech Talks
- リファレンスモードについて
- A14 BionicのMetal性能の向上について
- AppでのApple Pro Display XDRのサポートについて
- A13 BionicにおけるMetalの機能強化
- 4K、HDRのHLSストリームのオーサリング
- Apple TV 4K用にAppをアップデート
- HDRビデオの紹介
WWDC22
WWDC20
WWDC19
-
ダウンロード
Display and Color Technologiesチームの Ken Greenebaumです 「EDRによるHDRレンダリング」 をご視聴いただき ありがとうございます この技術を共有できることを 嬉しく思います このセッションの主な内容と 誰に向けたものかを 簡単にお話します まずEDRとは 何かから始め EDRを既存のApp に追加するための 4つのステップを解説します 次にレンダリングを よりコントロールするための ネイティブ EDR APIについて 最後にEDRの 効果的な活用方法を 紹介します
EDRとは何でしょう? EDRという頭字語を 知らない方もいるでしょう
"Extended Dynamic Range" の略がEDRです
Appleでは 自社プラットフォームで 使用するHDR表現と HDRレンダリング技術の 両方を EDRと呼びます
皆さんがよくご存知の カラーマネジメントと 似たようなものです 本セッションは様々なタイプの Appの開発者にとって 役立つでしょう まずはAppleが ここ数年でリリースした CG技術 HDRディスプレイ 特にXDRディスプレイに 関心のある開発者
次に ハードコアゲームの 開発者です 臨場感のあるリアルな ゲーム体験を作り出し 既存のレンダリング機能を より強化するのに EDRが役立ちます さらに プロ向けAppの開発者 HDR動画や画像に スタジオリファレンスを 求めるなら EDRを活用できます
最後に グラフィックスを そこまで 重視していなくても HDR画像や 動画コンテンツを 活用したいと考える 開発者もいるでしょう HDRは AppleのEDR技術が 可能にするものです 後に触れますが Appleが誇る 高性能ディスプレイは すでに多くのユーザーから 愛用されています エコシステムでは 美しいHDRコンテンツが 撮影 ストリーミング ダウンロードされ ゲームおよびプロ用の HDR Appが App Storeで入手可能です EDRは適応性のある技術です HDRコンテンツを 多様な機能を持つ ディスプレイに マッピングするだけでなく さらに多岐にわたる 視聴条件もサポートします ディスプレイが 暗闇と明るい環境で 大きく違って見えるのを ご存知ですか? 屋内で見る時の 明るく鮮やかな色は 屋外だとローダイナミック レンジにより その鮮やかさが低下します ディスプレイは 変わっていません 任意の明るさ設定が されていれば 常に同じライトが使われます 変わったのは環境と その環境に素早く適応した あなたの視覚です 暗い環境では 視覚は 主な光源である ディスプレイ上の コンテンツに適応します しかし明るい環境では ユーザーの視覚は 暗いディスプレイではなく 環境に適応します そのためコンテンツの 鮮やかさが低下し 暗い部分が つぶれてしまうのです
これに対しEDRは その基となる 環境適応技術により ホワイトポイント ブラックポイント リファレンス ホワイトブライトネス ダイナミックレンジなどの ディスプレイパラメータを ダイナミックに適応させ ユーザーの適応した視覚に ディスプレイを表示します EDRの適応性には 多くのメリットがあります 最も驚くべきなのは EDRにより真の HDRレスポンスが作り出され 従来のSDRディスプレイでも 表示可能なことでしょう
つまり 明るさが 低く設定された ディスプレイを 暗い環境で見た時も HDRが楽しめるのです 同様にEDRは 明るいHDRディスプレイで 状況に合わせて 最適化された HDR機能を発揮します これにより HDRコンテンツは 暗い環境でも 美しく表示され 同時に明るい環境では 低減された最適な ダイナミックレンジが 提供されます この画像のように シャドウのディテールは そのまま維持されます EDRレンダリングは 当社がこれまで発売した ほとんどのデバイスで サポートされています HDR機能をEDRヘッド ルームの点から説明しました これはディスプレイに レンダリング可能な 最も明るい EDRピクセルである 従来の最大SDRホワイトより 遥かに明るいものです EDRヘッドルームは ディスプレイの性能や 現在の ブライトネス設定など 他のパラメータによって 変わります
ほとんどのMacや iPadに使用される 従来のバックライト搭載 ディスプレイでは 最大2倍の非常に優れた SDRが利用可能です XDRディスプレイの iPhonesには 最大8倍のSDR EDR ヘッドルームがあります 最新のiPad ProのLiquid Retina XDRディスプレイは なんと16倍のSDRを 実現します 一般的な外部HDR 10 ディスプレイを Mac iPad AppleTVで 使用する際は 約5倍のSDRが 提供されます Pro Display XDRでは 明るさが 最低の4ニトに 設定されている場合 既定のXDRプリセットで 驚異的な400倍の SDRにレンダリングします 多くのユーザーが HDR対応の ディスプレイを 使用しているだけでなく HDRコンテンツが 主流になりつつあります 商用的な HDRコンテンツに加え ユーザー自身が iPhoneなどで撮った 画像や動画が エコシステム上に 増えています EDRはすでに 非常に多くのAppから 採用されています EDRをサポートしている 人気ゲームには 「Baldur's Gate 3」 「Divinity: Original Sin 2」 「Shadow of the Tomb Raider」等があります AppleTVでは HDRコンテンツを提供する サービスが増えており TV App Netflix YouTube等がその例です さらに多くの Pro Appが EDRを採用し それに対する投資と プラットフォーム上の HDRコンテンツの 量が増加しています Affinity Photo DaVinci Resolve Cinema 4D Final Cut Pro Nuke Pixelmator Proは その一例です 我々は“HDR”と 区別するために この技術を “EDR”と名付けました HDRは人によって 解釈が異なるからです ハイダイナミックレンジと 言われると多くの人は 深いブラックを表示できる 明るいディスプレイを 連想します 映像クリエイターは コンテンツの形式や HDR10 Dolby Visionを 思い浮かべるかもしれません 技術者にとっては PQやHLGなどの 伝達関数を意味するでしょう アーティストの場合 明るいハイライトや 暗いシャドウディテールを 持つ 超現実的な 絵画的なトーンマップとして 解釈するのが一般的です SDRトーンマップを RITが作り出す ウルトラHDR OpenEXR画像 として考えてください トーンマップでは 輝く電球と シャドウディテールが すべて表示されます しかし元のHDR画像の ドラマチックなダイナミック レンジは失われます EDRは絵画的に HDRからSDRへ変換し 意図を損ないながらも全ての 詳細を守る技術ではなく 真のHDRレンダリングと 言えます
RITチームはこのように 18段階の Digital SLR露出を 組み合わせ 50万対1の ダイナミックレンジで HDR画像を作成しました EDRは浮動小数点で これを完全に表しています 画像の被写体である Luxoランプの リファレンスホワイト1.0 におけるピクセル値および 電球の発光オーブなどの より明るい ディテールとして 表される値は 500に近付き ランプベースよりも 500倍明るくなります EDRの実装により システムの全要素の リファレンスホワイト間の マッピングが行われます コンテンツの リファレンスホワイトから ディスプレイへ さらにそこから ユーザーの適応した視覚へ このマッピングは EDRの利点を 発揮するのに欠かせません HDRとSDRコンテンツの 同時共存 複数の環境における HDRディスプレイの ダイナミックレンジの 露出最適化 さらに従来の SDRディスプレイで HDRをレンダリング するとともに EDRで優れた ダイナミックレンジを 実現すること等が 可能になります 例えば Pro Display XDRでは 明るさが最大の500ニト に設定されている場合 最大3.2のEDR値が クリッピングすることなく レンダリングされます ランプヘッドなどの より明るい要素は より大きい EDR値を持っており ディスプレイの1,600ニト の上限に固定されます 薄暗い〜暗い環境の際や 明るさスライダーを 手動で調整する際に ディスプレイの 明るさ設定を 最小4ニトに下げると 最大400のEDR値が レンダリング可能になり 画像の ダイナミックレンジの ほとんどを実現します 画像の最も明るい要素は ディスプレイの 1,600ニトの 最大明るさに レンダリングされ 電球の輪郭を明瞭に示します 同様に 明るく輝く カラーチェッカーの色など 他のディテールも 明らかになります ユーザーの視覚が画像の 4ニトの リファレンスホワイトに 適応することで 画像の最も明るい要素は ランプベースより 400倍明るく レンダリングされます
次にEDRの 浮動小数点による HDR表現と レンダリングパイプライン についてお話します
この色度図で示すように 浮動小数点であるEDRは 人間の目で見える すべての色を表現できます 同様に 完全に レンダリングされた場合に 目を痛める可能性のある 明るさも表現可能です EDRは将来の 要件にも対応する技術です 先述の通り EDRは表現技術だけでなく HDRレンダリングの パイプラインでもあります EDRはAppleが開発した カラーマネージメント 技術の 拡張技術であり 長期に渡って 活用されています 強化GPUによるカラー マネジメントがされた動画は MacOS 10.4 Tigerで 最初に発表されました 概念的には 通常の色域と 広い色域のメディアを並べて 表示するのと同様に EDRを使用すると HDRアセットと SDRアセットの 調和がとれた方法で 画面を共有し 様々な機能のディスプレイに 適切にレンダリングできます これは開発者が 既存のSDRアセットを 使用し続けながら 必要に応じて EDRサポートを選択的に 追加できることを意味します EDRによるHDRピクセル値の 表現技術を 視覚的に見ていきましょう
EDRは浮動小数点 による表現技術です EDR 0.0は黒を表し 1.0はSDRの上限 つまり “リファレンスホワイト”や “UIホワイト”を表します よってEDR 0.0~1.0は いつも通り SDRレンジを表します これらの値は 画像の被写体を表し レンダリング時クリッピング されることはありません 1.0を超えるEDR値は ハイライトや 発光面など SDRの明るさを 超える値を表します これらの値は 表現可能な一方で 明るくなり過ぎる ことがあり レンダリング時に クリッピングされます EDRはディスプレイが 従来の電力感度や 新たなHDR伝達関数を 備えているかに関係なく ディスプレイを駆動する ために使用されます Pro Display XDRを PQベースの 既定XDRプリセットで 使用するとしましょう EDR 0.0は0ニトの PQコード経由で ディスプレイを 0ニトにします “リファレンスホワイト” と呼ばれるEDR 1.0はいつも通り ディスプレイの明るさ調節 スライダー あるいは 自動明るさ調整により スケールされます The XDRプリセットの リファレンスホワイト 明るさレンジは4~ 500ニトと一般的です この例では最大 500ニトの設定とします 明るさ設定に関わらず このプリセットでは ピークホワイトは 常に1,600ニトです よって1,600ニトの ピークホワイトを 最も明るい500ニトの リファレンスホワイトで割り レンダリング可能な EDR値である EDRmaxは3.2となります ディスプレイにレンダリング 可能な最も明るい値は リファレンスホワイトより 3.2倍明るいため 3.2倍のSDRヘッドルームが あることになります まとめると Pro Display XDRでは デフォルトの XDRプリセットを使用し ディスプレイの明るさ (リファレンスホワイト)を 500ニトで使用すると EDR値0.0〜3.2が 0.0〜1,600ニトとして ディスプレイに レンダリングされ EDR1.0は500ニト として表示されます EDRmaxの3.2を超える EDR値は1,600ニトの ピークホワイトに クリッピングされます 驚くべきことに ディスプレイの明るさが 最小の 4ニトに低下しても 最大400のEDR値が レンダリング可能になり 真のダイナミックレンジで 非常に明るいディテールを 表示できます これがEDRの仕組みです 次にご自分のAppに EDRを取り入れる方法を 見ていきましょう EDRを追加するには 4つのステップがあります 各ステップは簡単ですが すべてを実行しないと 効果は低く EDRの結果が 正確に得られません
まず 適切なコンテクスト レイヤ またはオブジェクトに 属性を追加し EDRをリクエストします 次に拡張色空間を バッファ レイヤ またはAppと関連付けます 拡張色空間を指定しない場合 カラーマネジメントは 1.0以上の EDR値をクリッピングします カラーマネジメントは ソースと目的地の色空間が 一致しない場合にのみ 機能する可能性があるため このクリップは断続的に なるか コンテンツに 依存する可能性があります
次に 1.0以上の値を表せる ピクセルバッファ形式を 選択します 通常これは 浮動小数点の形式になります 最後に 光る要素を表すために AppはSDR 0.0~1以上の ピクセルを生成する 必要があります 既存のAppにEDRを 追加したい 場合もあるでしょう 最も簡単な方法は既存の SDRコンテンツを HDR動画または
画像コンテンツと 置き換えることです その後 先述の4つの ステップを実行してください メールAppなどの 一部のAppでは HDRコンテンツが ある場合にのみ EDRが有効化されます AVFoundationの AVPlayerインターフェイスは Dolby Vision HDR 10 HLGなど 多くのHDRビデオ形式を サポートしています AVPlayerはwatchOS以外の 全プラットフォームで 可能な場合 これらの形式を自動的に EDRとしてレンダリングします AVPlayerベースの 既存Appで EDRにより HDR動画形式を レンダリングするのに 必要は変更はありません EDRが有効化されたAVPlayer のコード例を示します AVPlayerの playerWithURLを使用して 通常通りAVPlayer インスタンスを作成します この例ではHDR動画 コンテンツを指定しています playerLayerWithPlayerで レイヤにプレイヤーを追加し 最後に コントローラーを プレイヤーに向け 再生開始をリクエストします AVFoundationはHDRメディアを EDRとしてレンダリングするのに 必要なことを 自動的に実行し コンテンツタイプに 基づいて EDRを有効化 または無効化します HDR動画のプレイバックは 非常に簡単です 次にHDR画像の レンダリングについてです ImageIOは幅広いHDR画像 形式をサポートしており デコードされたピクセルを 浮動小数点バッファで EDRとして返します ImageIOは全プラット フォームで利用できますが デコードされた結果は 現在 macOSでのみEDRとして レンダリングできます この後に話す CAMetalLayerの例で ImageIOベースの アセットを Appに組み込む方法を 説明します 次に ネイティブEDR API について見ていきましょう 先述の通り ネイティブEDR APIは ゲームやPro Appなどの ために作成されました 開発者はカスタムコンテンツ をレンダリングし HDRメディアのレンダリング 方法を細かく制御できます 現在このAPIは CAMetalLayerやNSOpenGLView を使って macOSで使用可能です 推奨ネイティブEDR フレームワークである CAMetalLayerを使った 例を示します まず4ステップのうち 最初の3つを 見ていきましょう EDRの選択 拡張色空間の設定 FP16ピクセル バッファ形式の選択 です まずmetalLayerの “wantsExtended DynamicRangeContent”属性を “yes”に設定して EDRを選択します 次にmetalLayerの色空間を ExtendedLinear DisplayP3などの 拡張色空間にします その後metalLayerの ピクセル形式を RGBA16Floatなどの 浮動小数点形式に設定します 次に4つ目のステップで 実際にEDRピクセルを 生成しましょう 今回はImageIOを使って HDR画像コンテンツを インポートし 結果をEDRテクスチャとして レンダリングします 少し複雑なので 次の順番に 一つずつ説明していきます HDRコンテンツから CGImageを作成 デコードされた画像を浮動 小数点ビットマップに描画 浮動小数点 テクスチャを作成 EDRビットマップを テクスチャにロード 最後に EDRが有効化された メタルパイプラインに テクスチャをレンダリング まずCGImageSource CreateWithURLと CGImageSource CreateImageAtIndexを使い CGImageが HDRimageURLで指定した ソースから作成されます 次に先程metalLayerで 設定したのと 同じ色空間を使って CGBitmap ContextCreateで CGContextを作成し CGContextDrawImageを 使って 浮動小数点コンテクストに EDR画像を描画します
次にnewTexture WithDescriptorを使って RGBA16Float タイプの 浮動小数点テクスチャを 作成します CGBitmapContextGetData を使って EDR画像データを replaceRegionを用いて EDRテクスチャにロードします 最後にEDRテクスチャを EDRを有効化した メタルパイプラインに レンダリングすることで ダイナミックな 結果が得られます OpenGLベースの Appについては 同様のステップで NSOpenGLViewにおいて EDRを有効化する方法を 別途説明します EDRを採用することで カラーマネジメントを 最大限活用できますが この動画では その点は省略します 今から 次のステップを説明します EDRの選択 浮動小数点 ピクセルバッファ形式の選択 NSOpenGLViewへの EDRとコンテンツの描画 NSOpenGLViewは自動的に カラーマネジメントされず そのため 拡張色空間の設定は不要です まずEDRを選択するには NSOpenGLViewの “wantsExtendedDynamicRange OpenGLSurface”属性を “yes”に設定します 次に64のColorSizeで ピクセルバッファ形式を NSOpenGLPFAColorFloatに 設定します 最後にEDR値を OpenGLViewに描画し Appを実行すると 結果が得られます ここまで 既存のAppに 基本的なEDRを 組み込む方法を説明しました 次にEDRを使って Appを最大限 活用するための 方法を紹介します EDR設定の 4つ目のステップは 拡張色空間の設定でした ここまでの例では 適切な拡張色空間を 明示的に設定してきました しかし 多くのAppは 色空間を明示的に設定せず フレームワークが提供する 既定の色空間を使用します 多くの場合 これはディスプレイや 組成空間に対応しており それらは 拡張範囲でないため 対処しない限り EDRが損なわれます 既存の色空間を拡張範囲に する方法を見ていきましょう まず 既存の色空間を取得します この場合は ビューのウィンドウからです 次にCGcolorspace CreateExtendedを使って その色空間を 拡張範囲にします 最後に 新しく生成された 拡張範囲の 色空間を 必要に応じて ウィンドウ バッファ またはレイヤに割り当て 色空間を明示的に 設定しないAppが EDRを 使用できるようにします 次に EDRコンテンツを 生成するための ベストプラクティスを 紹介します EDRコンテンツが 1.0以上の値を持つことは 説明しましたが このコンテンツの 生成方法や HDRソースからの変換方法 には触れていませんでした EDRコンテンツの生成時に 注意したいのが 「グローイングバニー シンドローム」です コンテンツに不気味な 虹色の輝きが生じ 適切に作成されたものと 比べて 薄暗く見える現象のことです 先述のように EDR 1.0以上の ピクセルは 鏡面ハイライトと 発光面のみを エンコードします つまりSDRコンテンツを HDRコンテンツにするのは 不適切だということです SDRコンテンツはネイティブ の0.0〜1.0の範囲で EDRとそのまま 互換性があります これにより SDRの リファレンスホワイトが HDRコンテンツに 揃えられます HDRコンテンツが 明るすぎる場合 EDR 1.0を超える 暗い要素や シャドウとなる はずのものが 適切に作成された コンテンツと 比べると不自然に見えます ユーザーの視覚は この明るすぎる コンテンツに適応し始め 他のコンテンツがより 暗く見えるようになります これを例で示します 写真家やアニメーターが 露出設定に使う 18%のグレーカードを 少女が持っています 写真の被写体は この少女であるため 写真家やアニメーターは 彼女の顔が リファレンスホワイトと 同等またはそれ以下に なるよう露出を設定して クリッピングされない ようにします ほとんどのUI要素も EDR 1.0を超えるべき ではありません ただし EDRカラーピッカーや 注意を引くために 明るく照らされた 一時的に スケーリングされた UIなどの例外もあります 太陽や雲などの発光面 および 光沢のある面に反射する 太陽などの 鏡面ハイライトは リファレンスホワイトよりも はるかに明るくなるため EDRは1.0を 超えることになります 最も明るい要素はすでに SDRエンコーディングにより クリッピングされています 結果として SDRコンテンツは EDR 0.0~1.0として 正しく表されます 一部のワークフローでは HDR形式を 明示的にEDRに 変換する必要があります ImageIOはHDRコンテンツを EDRにデコーディングし それ以上の変換は 必要ありません 例えば HLGはEDR 0.0~12.0に デコードされ EDR 1.0がリファレンス ホワイトを表します ImageIOは 他のHDR画像形式を 独自の特定の 範囲にデコードし EDR1.0は常にソースの リファレンスホワイトに 対応します AVFoundationは現在 HDR10などのHDR形式を EDRにデコードしないため EDRレンダリングでの 使用のために 調整が必要です この変換は 2つのステップで 簡単にできます まず 逆伝達関数を適用して 線光を変換します 次にメディアのリファレンス ホワイトで割ります 例えばPQコンテンツは 100ニトなので リファレンスホワイトは EDR 1.0にマッピングされ 10,000ニトの 最大PQ値は EDR 100に マッピングされます この写真では デジタルとフィルム 両方でよくあるように 空が白に クリッピングされています EDRは画像の 被写体を表す EDR 1.0までの値を クリッピングしませんが EDRは現在の EDRmaxを超えているため 現在の システムディスプレイと 設定に レンダリングできない リファレンスホワイトより 上の値をクリッピングします リファレンスホワイトより 上の これらの値は 雲 空 太陽など この画像では 見ることができない ハイライト または放射面であるため 通常はクリッピングしても 問題ありません しかし 明るいディテールを クリッピングすると 問題になることがあります 例として 雲の上高くを飛ぶ 太陽に照らされた 飛行機の画像を 見てみましょう 青く表示された “HDR11”がわかりますか? 明るく照らされた数字と それが描かれた胴体は 両方とも リファレンスホワイトより 大きくレンダリングされる 可能性があるため ディスプレイの機能と 現在のEDRmaxによっては クリッピングされる ことがあります 映画やゲームでこの数字が 重要な要素である場合 動的トーンマッピングを 使用して クリッピングを回避 または管理し 数字を 表示したままにできます 高度なAppがいかに 現在のEDRmax値に 遅れずについていくかと それに応じて レンダリングするものを 適応させる方法を紹介します Appでは NSScreen通知を オンにして シーン内のオブジェクトの 明るさを調整したり シーンの露出を変更したり ブルームエフェクトを 適用したり ソフトクリップを適用して 重要な詳細を保護できます 現在 NSScreen インターフェイスで 使用できる唯一の 動的なEDR値である maximumExtendedDynamic RangeColorComponentValueは レンダリング可能な 現在の 最大線形EDR値を表します 先述の通り EDRmaxを超えるEDR値は EDRmaxに クリッピングされます またEDRmaxはディスプレイの 明るさやTrue Toneなど 時間の経過とともに 変化する 可能性のある 特性に依存するため 動的に変化する 可能性があります NSScreenで使用できる 他2つのEDR値は 静的であり 時間の経過とともに 変化しません 前の値とは対照的に maximumPotential ExtendedDynamic RangeColor ComponentValueは このディスプレイで クリッピングせずに レンダリングできる 可能性のある 最大線形 EDRピクセル値を返します これはディスプレイの 明るさと他の機能が 適切に設定されている ことが条件です 最大潜在EDRは コンテンツのSDRまたは HDRバージョンを使用する 必要があるかどうかや EDRを有効化する 価値があるかどうかを 決定するのに使用できます 名前に“潜在”とあることに 注意してください レンダリング可能な現在の 最大値であるEDRmaxは これを下回る場合があります EDR非対応のディスプレイ またはプリセットには 1.0が返されます 最終的な静的値である maximumReference ExtendedDynamic RangeColor ComponentValueは リファレンス標準を 忠実に達成するのを目指す Pro App開発者にとって 重要です 特定のディスプレイで クリッピングや トーンマッピングなどの 歪みないレンダリングを 保証する 最大EDR値を提供します リファレンスレンダリング 非対応のディスプレイでは 0.0が返されます ではNSScreenを介して EDR値を読み取る コードの例を見てみましょう ここでは2つの 静的EDR値である maxPotentialと maxReferenceを読み取ります EDR値はディスプレイに よって異なるため 実際にAppを 実行している スクリーンで 呼び出してください この例では ウィンドウと関連付けた NSScreenを使用しています Appは “NSWindowDidChangeScreen” 通知をオンにし 画面変更イベントを 受信すると 現在のEDRパラメーターを 照会します 現在のEDRヘッドルームに 基づいて レンダリング内容を 変更することで 動的なEDR変更に 遅れないようにできます トーンマッピングに関する 話題の最後に CAMetalLayerトーンマッパー を簡単に紹介します これはHLGやHDR10などの HDR動画を作成し プロジェクトベースの HDRマスタリングパラメータ にレンダリングする Pro Appに役立ちます システムAppおよび AVPlayerを 採用しているAppは CAMetalLayerトーンマッパー を使用して メディア固有の 光から光への 伝達関数と 他の方法では レンダリングできない HDR値の ソフトクリップを提供します CAMetalLayer トーンマッパーは “CAEDRMetadata” 属性により有効化され macOSで利用可能です この例ではAppの CAMetalLayerで “EDRMetadata”属性を 設定して システムトーンマッパーを 有効化する方法を示します 様々なEDRMetadata コンストラクタが使用でき これらは HDR動画規格および 提供されるマスタリング情報 に固有のものです ここでは パラメーターをとらない HLGMetadata コンストラクタを使用します 次にHDR10コンストラクタの 1つを見ていきます これは3つの パラメータを取ります 明示的な最小値と maximumLuminance (両方ニト)と 多くの場合HDR10の100ニト リファレンスホワイトに 設定される opticOutputScaleです 構築したら オブジェクトをAppの CAMetalLayerに設定し このレイヤで レンダリングされた すべてのコンテンツが 提供 されたメタデータに基づき システムトーンマッパーで 処理されるようにします 適応性のあるトーン マッピングに関連して 現在レンダリング可能な 最も明るい白で 描画したい場合があります NSScreenから現在のEDRmaxを 取得する方法は すでに説明しましたが EDRヘッドルームは 線形値であり ピクセルはほとんどの場合 非線形にエンコードされます 最後の例では EDRmaxをAppの 潜在的に非線形の 色空間に変換します まずCGColorSpaceCreate WithNameを使用して レンダリングする 線形EDRmaxの 白色ピクセルを作成します 次に CGColorCreateCopy ByMatchingToColorSpace を使用して 線形EDRmaxピクセルを Appの色空間に変換します 生成される色は EDRが有効化された 全Appで使用できます 最後にお話する内容は EDRのパワーと パフォーマンスについてです すべての CGレンダリングと同様に EDRの影響の評価は 複雑なことが多く 特定のデバイスで 使用される ハードウェア アーキテクチャと ディスプレイ技術に 依存します 今回は詳しく触れませんが 注意が必要なポイントが いくつかあります 例えば明るいピクセルの場合 消費電力が増すことが多く EDRで使用される 浮動小数点バッファが 大きくなる 可能性があるため 他の方法で使用される 固定小数点バッファよりも 多くの帯域幅を消費します つまり より多くの 電力が消費されます CAEDRMetadataベースの トーンマッピングを有効化 するのにも 追加の処理パスが必要です これにより 遅延と帯域幅が増加します EDRは 多くの機能と同様に 無料ではないため 慎重に使用しましょう HDRコンテンツと潜在的な EDRヘッドルームの 両方が利用可能な場合に EDRを有効化するのが 最も効果的です そうでない場合は EDRを無効化しましょう 同様にEDRのヘッドルーム または現在の EDRmaxヘッドルームが 1.0を大幅に超えるか どうかに基づいて コンテンツの HDRまたはSDRバージョンを 選択してください あるいは単純に ユーザーが 違いに気付ける場合にのみ EDRを 有効化するのもいいでしょう 今回は短時間でEDRに関する 多くのことをお話しました EDRに興味を持ち 実際に使用したいと 思っていただけたら幸いです まとめると EDRはmacOS iOS iPadOS tvOSデバイスで利用可能で すでに使用している カラーマネジメントと SDR表現の機能を 拡張するものです Appへの導入も簡単です EDRは業界のHDR標準と 互換性があり 様々なデバイスや 環境において 非モーダルな体験を 提供します HDR動画プレイバックや Apple Pro Display XDR および EDRのメタルレンダリング に関する情報は 他の動画やリソースを 参照してください ご視聴 ありがとうございました 引き続きWWDCを お楽しみください [音楽]
-
-
16:00 - AVPlayer automatically uses EDR with HDR content
// Instantiate AVPlayer with HDR Video Content VPLayer* player = [AVPLayer playerWithURL:HDRVideoURL]; AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; // Play HDR Video via EDR AVPlayerViewController* controller = [[AVPlayerViewController alloc] init]; controller.player = player; [player play];
-
17:52 - EDR with CAMetalLayer 1
// Opt-in to EDR metalLayer.wantsExtendedDynamicRangeContent = YES; // Set extended-range colorspace metalLayer.colorspace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearDisplayP3); // Select FP16 pixel buffer format metalLayer.pixelFormat = MTLPixelFormatRGBA16Float;
-
18:53 - EDR with CAMetalLayer 2
// Create CGImage from HDR Image CGImageSourceRef isr = CGImageSourceCreateWithURL((CFURLRef)HDRimageURL, NULL); CGImageRef img = CGImageSourceCreateImageAtIndex(isr, 0, NULL); // Draw into floating point bitmap context size_t width = CGImageGetWidth(img); size_t height = CGImageGetHeight(img); CGBitmapInfo info = kCGBitmapByteOrder16Host | kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents; CGContextRef ctx = CGBitmapContextCreate(NULL, width, height, 16, 0, metalLayer.colorspace, info); CGContextDrawImage(ctx, CGRectMake(0, 0, width, height), img); // Create floating point texture MTLTextureDescriptor* desc = [[MTLTextureDescriptor alloc] init]; desc.pixelFormat = MTLPixelFormatRGBA16Float; desc.textureType = MTLTextureType2D; id<MTLTexture> tex = [metalLayer.device newTextureWithDescriptor:desc]; // Load EDR bitmap into texture const void* data = CGBitmapContextGetData(ctx); [tex replaceRegion:MTLRegionMake2D(0, 0, width, height) mipmapLevel:0 withBytes:data bytesPerRow:CGBitmapContextGetBytesPerRow(ctx)]; // Draw with the texture in your EDR enabled metal pipeline
-
20:30 - EDR with NSOpenGLView
// Opt-in to EDR - (void) viewWillMoveToWindow:(nullable NSWindow *)newWindow { self.wantsExtendedDynamicRangeOpenGLSurface = YES; } // Select OpenGL float pixel buffer format NSOpenGLPixelFormatAttribute attribs[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAMultiSample, NSOpenGLPFAColorFloat, NSOpenGLPFAColorSize, 64, NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core, 0}; NSOpenGLPixelFormat* pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs]; // Draw EDR content into NSOpenGLView
-
21:46 - EDR with NSOpenGLView
// Get existing colorspace from the window CGColorSpaceRef color_space = [view.window.colorSpace CGColorSpace]; // Promote the colorspace to extended-range CGColorSpaceRef color_space_extended = CGColorSpaceCreateExtended(color_space); // Apply the extended-range colorspace to your app NSColorSpace* extended_ns_color_space = [[NSColorSpace alloc] initWithCGColorSpace:color_space_extended]; view.window.colorSpace = extended_ns_color_space; CGColorSpaceRelease(color_space_extended);
-
29:00 - EDR display change notifications via NSScreen
// Read static values NSScreen* screen = window.screen; double maxPotentialEDR = screen.maximumPotentialExtendedDynamicRangeColorComponentValue; double maxReferenceEDR = screen.maximumReferenceExtendedDynamicRangeColorComponentValue; // Register for dynamic EDR notifications NSNotificationCenter* notification = [NSNotificationCenter defaultCenter]; [notification addObserver:self selector:@selector(screenChangedEvent:) name:NSApplicationDidChangeScreenParametersNotification object:nil]; // Query for latest values - (void)screenChangedEvent:(NSNotification *)notification { double maxEDR = screen.maximumExtendedDynamicRangeColorComponentValue; }
-
30:28 - CAEDRMetadata tone-mapper
// HLG CAEDRMetadata* edrMetaData = [CAEDRMetadata HLGMetadata]; // HDR10 CAEDRMetadata* edrMetaData = [CAEDRMetadata HDR10MetadataWithMinLuminance:minLuminance maxLuminance:maxContentMasteringDisplayBrightness opticalOutputScale:outputScale]; // Set on CAMetalLayer metalLayer.EDRMetadata = edrMetaData;
-
31:35 - Computing your app’s brightest pixel
// Create the linear pixel we want to render double EDRmaxComponents[4] = {EDRmax, EDRmax, EDRmax, 1.0}; CGColorSpaceRef linearColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceExtendedLinearDisplayP3); CGColorRef EDRmaxColorLinear = CGColorCreate(linearColorSpace, EDRmaxComponents); // Convert from linear to application’s colorspace CGColorSpaceRef winColorSpace = [self.window.colorSpace CGColorSpace]; CGColorRef EDRmaxColor = CGColorCreateCopyByMatchingToColorSpace(winColorSpace, kCGRenderingIntentDefault, EDRmaxColorLinear, NULL);
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。