ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Metalのデバッグ、プロファイリング、アセット作成ツール
Xcodeを使用して、Metalのデバッグ、プロファイリング、アセット作成のワークフローを次のレベルに引き上げる方法を紹介します。レイトレーシングとGPUプロファイリングのための最新ツールを確認し、Metalデバッガのワークフローについて確認します。また、最新のGPUテクスチャフォーマットをすべてサポートし、マルチプラットフォームのアセット作成パイプラインに簡単に統合できるテクスチャコンバータツールの使用方法も紹介します。
リソース
- Debugging the shaders within a draw command or compute dispatch
- Metal
- Metal Developer Tools on Windows
関連ビデオ
WWDC23
WWDC22
WWDC21
WWDC20
-
ダウンロード
こんにちは EGorです 本日はMetal Debuggerのすべての改善点と 新機能についてお話しさせていただきます 今年は レイトレーシングや関数ポインタなどの Metal機能の さらなるサポートを提供します
Appleプラッフォーム全体で GPUを活用できるよう GPU Timelineや 一貫したGPUパフォーマンスなど 最新のプロファイリング ワークフローを追加しました
我々は シェーダー検証の より広範なサポートや精密な キャプチャコントロールを含む その他の デバッギングワークフローを改善しました
また テクスチャ圧縮の進展についても 後ほど同僚のアマンダがお話しします まずはレイトレーシングから始めましょう 去年 新しいMetal レイトレーシングAPIをご紹介し 現在 Xcode 13では シェーダーに柔軟性をもたらす 関数ポインタと関数表 そして高度に抽象化され再使用可能な シェーダーライブラリコードを 構築する方法を提供するダイナミックライブラリを Metal Debuggerでサポートしています またレイトレーシング向けに Acceleration Structure Viewerという 真新しいツールを発表します Metal Debuggerの レイトレーシングをご覧ください ModernRendererサンプルAppの GPUトレースを開きました Metalレイトレーシングを使用し シャドウや 環境遮蔽などの効果を得るために変更されています 美しいシャドウマップが作成されています バインドリソースで 加速構造が確認できるよう ディスパッチコールを選択しました ここから 加速構造を開き 新しい加速構造ビューアーに移動します 右側には よくあるビストロの光景の幾何学 左にはその概要が表示されています インスタンスをクリックすると それがビューアーとシーン概要で選択されます それを拡大すると変革行列や その他のインスタンスプロパティを確認できます オプションキーを押しながらシーンビューアーを クリックすると 個々の幾何学の選択もできます シーン概要で選択でき その逆も可能です
また ビューワーにある加速構造で使用された 関連の交差関数の確認も 行えます しかし加速構造ビューアーは 幾何学を表示するためだけのものではありません 右下には シーンのプロパティを視覚化するのに役立つ いくつかのモードが あります たとえば バウンディングボリュームトラバースモードは 幾何学の複雑性を視覚化するのに役立ちます 色の濃い部分は バウンディングボリューム階層のトラバースが 他の部分と比べて比較的計算的に 高価になることを示しています シーンの異なる部分に ポインタを移動させるとすべてのモード向けに 関連の情報を表示する小さなビューがあります ここにはバウンディングボックストラバースの数と プリミティブ交差が表示されています
さらなる柔軟性を提供するために トラバース設定も含みました これを使用すれば シェーダー内の交差オブジェクトにある 同じプロパティを使用して 加速構造ビューアーを構成できます
レイトレーシングに関しては お話することがたくさんあります この詳細については 「Metalレイトレーシングによる ハイブリッドレンダリング」 一般的なAPIの詳細については 去年の 「Metalを使用したレイトレーシング入門」 をご覧ください 次はプロファイリングについてです Appのプロファイリングは重要なステップで すでにたくさんのすばらしいツールが利用可能です たとえば Instrumentの Metalシステムトレースを 使用すると 異なるレンダリングステージ GPUカウンターシェーダータイムラインの CPUとGPUの時間を示す タイムラインビューを探ることができます Metal Debuggerでは GPUカウンターはエンコーダーかドローごとで GPUから直接 豊富な一連の測定を表示します どちらのツールもAppのパフォーマンスの 補完的なビューを提供するすばらしいツールです しかしビューの調整には追加の努力が必要です そこでご紹介したいのが Metalシステムトレースと GPUカウンターが組み合わさった 新しいGPUプロファイリングツールです Metal DebuggerのGPU Timelineは Apple GPUs専用に 設計された新しいツールで パフォーマンスデータに対し 新しい観点を与えてくれ Appの最適化のポテンシャルポイントの 発見に役立ちます では当社一連のプロファイリングツールの 最新製品を見てみましょう
GPU Timelineは パフォーマンスパネルからアクセスできます Appからフレームをキャプチャした後 デバッグナビゲータで見つかります パフォーマンスパネルを開くと 一連の異なるトラックが 平行に表示されます 続ける前にエンコーダートラックが 平行である理由をご説明します Apple GPUでは 異なるレンダーパスの頂点とフラグメントステージ 計算ディスパッチは同時に実行できます これはApple GPUアーキテクチャにより 有効化され “tile-based deffered rendering”と 呼ばれるレンダリング技術を使用します Appのコンテキストで Apple GPUの平行な性質を ご確認いただくのが重要だと思いました ここでGPU Timelineが役立ちます 上部にあるのは 頂点 フラグメント 計算 エンコーダータイムラインで 各エンコーダが使用するリソースを 一覧できます エンコーダーの下には 稼働率帯 域幅リミッタカウンタがあります エンコーダータイムラインを見てみましょう
各エンコーダートラックを拡大して 集約されたシェーダータイムラインを確認できます
タイムラインをさらに拡大すると 個別のシェーダーが 滝のような形で表示されます
エンコーダーの移動は簡単です エンコーダートラックを選択して 右のすべてのエンコーダーを表示します ここでは平均時間でソートできます 個々のエンコーダーをクリックすると サイドバーに詳細が表示されます たとえば ここではこのレンダーコマンド エンコーダーの添付ファイルを確認できます
エンコーダーを選択すると アクティブな時間範囲が トラック全体で強調されます これで異なるステージのオーバーラップの検証や エンコーダーのカウンター値の 関係付けが簡単に行えます
タイムラインビューから離れ カウンタータブに切り替えて GPUカウンターにアクセスするか エンコーダーのコンテキストメニューを開き そこからカウンターで開くこともできます
これはGPU Timelineのプレビューです Metal Debuggerで Appのパフォーマンスを把握する方法については 「Apple GPU向けの ハイエンドゲームの最適化」を ご覧ください
新しいプロファイリング方法をお見せしたところで そのパフォーマンスがいくつかの要因に 依存することを理解することが重要です
Metalについてお話しする時 GPUパフォーマンスの状態は 非常に重要な要因です オペレーティングシステムにより管理され デバイスの熱 システム設定 GPUの活用 その他のパラメータにより 下がったり上がったりします
状態の変化は 確認する プロファイリングの結果に影響を与えます
今年 我々はより一貫した結果でAppを プロファイリングする新しい方法をご紹介します Metalツール全体で GPU Performance Stateを 確認し 変更できる方法を追加しました まずライブパフォーマンスの録音に Instruments および Metalシステムトレース Metal Debuggerは GPUトレースのプロファイリングに 最後に Xcodeの Device conditionsは 一般的なユースケース用です ではInstrumentsから始めましょう 今年我々はGPU performance stateのトラックを Metalシステムトレースに追加しました 他のトラックと連結して使用し Appのパフォーマンスと デバイスのパフォーマンス状態を関連付けましょう でもお忘れなく パフォーマンス状態を確認できるということは 一部の要素にすぎません 一貫した再生産可能な プロファイリングを成功させるには デバイスに GPU Performance Stateを 設定する必要があります 今年新しくご紹介するのは Instrumentsでトレースを録音中に 特定のGPU Performance Stateを誘導する機能です 録音オプションにアクセスし 録音が始まる前に Peformance Stateを選択し その後通常通りトレースを録音します Instrumentsは デバイスが持続できる場合 トレース中に選択する状態を誘導します 時々 既存のInstrumentsトレースに 録音中に誘導された GPU Performance Stateが あるかを確認する必要があります この情報は 情報ポップオーバーの 録音設定セクションで確認できます
では Instrumentsから GPU Performance Stateを 確認し誘導する方法についてです 一貫したGPU Performance Stateを 活用する2つ目の方法は Metal Debuggerを使用する方法です AppのGPUトレースをキャプチャする際 デフォルトではXcodeが プロファイリングを行います これはキャプチャ時のデバイスの パフォーマンス状態と同じ状態で行われます この状態は先述の 要因により変動する場合があります 代わりに 自分で特定のパフォーマンス状態を 選択したい場合はデバッグバーの ストップウォッチボタンを使用します 選択後 Metal Debuggerが 再プロファイリングされ 完了後ボタンがハイライトされて 一貫したパフォーマンス状態の達成を表示します またサマリーページの“パフォーマンス”に 新しいパフォーマンスデータと 選択したパフォーマンス状態が表示されます この2つの方法は一連の Metalツールと関係しますが プロファイリングワークフローとは別に 一貫したパフォーマンス状態を 誘導したい場合もあります GPU performance stateを 設定する3つ目の方法は Device conditionsを 介した方法です
Appが異なる GPU Performance Stateで どう機能するかを確認したい場合は この方法が最適です Xcode 13では GPU Performance State Device conditionが 追加されています 持続可能で Xcodeに 接続されている限り オペレーティングシステムに 特定の状態を使用することを強制します Xcodeからこの条件を追加できます WindowでDevices and Simulatorsに行き デバイスを選択します “Device Conditions”に スクロールし 希望するレベルの “GPU パフォーマンス状態”を追加します をクリックして GPU performance stateの 変更を適用します 完了したら をクリックします
我々のツールから直接 GPU Performance Stateを 確認し これらの方法は変更可能なので Appのプロファイリングと テストに役立つでしょう プロファイリングワークフローの 最新製品と改善を 気に入っていただけると思います 皆さんのAppが さらに向上することを願います では今年のMetal Debuggerの その他の改善をご紹介しましょう まずはシェーダー検証の 改善についてです 次に精密なキャプチャコントロール その後に新しい パイプラインステートワークフローをご紹介します 最後はシェーダーデバッギングと プロファイリングの新しい2つの機能について 分離デバッグ情報と 選択的 シェーダーデバッギングです 去年 Xcode 1で 境界を超えたアクセスなど GPUのランタイムエラーの診断に役立つ シェーダー検証を発表しました
シェーダー検証が有効になり エンコーダーに検証エラーが発生すると 問題ナビゲーターにランタイムエラーが発生し 呼び出しに失敗したCPUとGPUの バックトレースが表示されます
これは別のセッションで詳細に説明されています シェーダー検証の詳細を学びたい場合は 「MetalでGPUのエラーを デバッグする」という 去年のトークをご覧ください
今年はシェーダー検証を拡張して より多くのユースケースをサポートし 関節コマンドバッファ ダイナミックライブラリ 関数ポインタと表を使用する際に 利用可能にしました これでAppの開発中に シェーダー検証をより広範囲に 使用できるはずです 次は新しい 精密キャプチャコントロールをご紹介します まずはキャプチャボタンを見て下さい Metalのロゴのようになっています Xcodeウィンドウの下部の デバッグバーにあります これをクリックすると新しいメニューが表示され ここでキャプチャのスコープを選択します デフォルトでは1フレームのキャプチャです ですがキャプチャしたい数を最大5まで 選択できます 親デバイスまたはコマンドキューが同じの コマンドバッファのキャプチャ 特定のMetalレイヤを表すものや MTLCaptureScope APIを 使用して Appのコードを定義できる カスタムスコープも選択することができます これらの新しいコントロールで いつどのようにMetal コールがキャプチャされるか すぐに決断できるようになります
次はMetalライブラリと パイプラインステートです Metal Appに欠かせない要素です Xcode 13では Appが使用する パイプラインステートとライブラリの検査が これまで以上に簡単になりました 実際に見てみましょう ここではModernRenderer サンプルAppから GPUトレースをキャプチャしました GBufferパイプライン ステートの仕組みを知りたく このドローコールを選択しました バインドリソースを見ると 使用されたパイプラインステートが確認できます それを開くとパイプライン ステートビューアーが開き ここで関数を調査し 他のプロパティを確認します さらに ビューアーで ステートに関連するパフォーマンスデータを 確認するか メモリビューアーから ステートを確認します Xcode 13では メモリビューアーに パイプラインステートがAppで 消費するメモリ量が表示されます これらはAppのGPUトレースを確認する際 Metal Debugger全体で パイプラインステートの検査を容易にする いくつかの追加機能です 次はMetal Debuggerの シェーダーデバッギングと プロファイリングについてです 現在 これらの機能を使用するには 選択肢が2つあります 1つ目は Appの実行中にソースコードから ライブラリをコンパイルする方法 2つ目は より最適な方法で Metallibファイルを オフラインで組み込まれたソースで構築し これらをランタイムで読み込む方法です しかしApp Storeのルールは AppをデバッグのMetallibで 公開することを許可していません つまり ライブラリをオフラインでコンパイルし シェーダーをデバッグしたい場合 二度コンパイルする必要がありました 一度目は開発中に組み込まれたソースを使い 配信向けには ソースなしでコンパイルします 今年はこれを変更します Metallibのコンパイル中に ソースのある別のファイルと 他のデバッギング情報を 生成できるようになりました これらのファイルには Metallibsym拡張子があり ライブラリに追加情報を組み込むことなく シェーダーのデバッグとプロファイリングが 行えるようになります 別々に持つことの最大のメリットは 2つのバージョンの同じMetallibを 持つ必要がなくなったという点です もう1つのメリットは Metallibsymファイルで シェーダーソースを妥協することなく Appのリリースバージョンの シェーダーのデバッグが可能になる点です
シェーダーソースファイルを Metallibsymファイルと共に Metallibにコンパイルする 方法の例をお見せしましょう Metallibをコンパイルする xcrunターミナルコマンドで始めます Metallibsymファイルを生成するには “record-sources”のフラグと “flat”のオプションを追加し コンパイラを実行するだけです 別のデバッグ情報ファイルに コンパイルされた シェーダーをデバッグしようとすると インポートするようプロンプトされます ソースをインポートをクリックすると すべてのライブラリを表示するダイアログが開き ソースファイルがインポート されたかを確認できます
ここでMetallibsym ファイルをインポートし インポートが完了したらライブラリとソースが 自動的に一致されます
インポートを完了したら ダイアログを閉じ シェーダーのソースを確認しデバッグします
あともう1つデバッギングの改善をご紹介します それは“選択的シェーダーデバッギング”です Appが大型のシェーダーを使用する場合 シェーダーのデバッギングの開始に 時間がかかることにお気づきでしょう これを改善するために 選択的シェーダーデバッギングを提供します デバッグスコープを限定し シェーダーをより迅速にデバッグするのに便利です ではこれを実際に見てみましょう
GPU ASTCDecoderを デバッグしたいとします でも このカーネル全体をデバッグしようとすると シェーダーデバッグ開始に時間がかかります それほど長く待ちたくありません なので代わりに デバッグスコープをこの decodeIntegerSequence 関数だけに限定します それを行うには右クリックして 関数のデバッグを選択すると “デバッグする関数”メニューが開きます 関数スコープはすでに選択されています デバッガーがほぼすぐに開始します
選択的シェーダーデバッギングは 巨大なシェーダーのバグを すばやく突き止めるのに役立ちます Metalツールの改善についての 報告は以上です 次はアマンダがテクスチャ圧縮の 進展についてお話しします アマンダ? EGor ありがとう テクスチャ圧縮ツールの最新情報について お話しします ツールの話をする前に Appleプラッフォームのテクスチャ圧縮の 基本について手短にご説明します この場合のテクスチャ圧縮は 定率でロッシー圧縮されたテクスチャデータです これはデカールやノーマルマッピングなど 静的テクスチャデータの オフライン圧縮を主に意図としたものです ランタイムで動的テクスチャ データを圧縮できますが 本日はそのことについては触れません ほとんどのテクスチャ圧縮は テクスチャをブロックに分割し 各ブロックを色のペアとして 圧縮することで作用します このペアはこれらのエンドポイントから 挿入された他の色を含む ローカライズされたパレットとパレットから 選択する毎ピクセルのインデックスを定義します 各フォーマットは強度が異なり 異なるテクスチャデータに適合します また Apple GPUは A12以降で 無損失のフレームバッファを サポートし 帯域幅の最適化に非常に便利です 去年の「GPUカウンタを使った Metal Appとゲームの最適化」 をご覧ください AppのGPUが使用するメモリ帯域の 測定方法の詳細が学べます もう1つのオプションは このプレゼンでお話しする GPUテクスチャ圧縮の上の テクスチャファイルの無損失圧縮の実行です これによりAppのダウンロードのサイズを さらに削減できます テクスチャ圧縮について ご説明したところで テクスチャ圧縮がAppに提供する メリットについてお話しします テクスチャ圧縮はAppの開発に関して 重要なステップです 一般的に ほとんどのゲームのメモリフットプリントには テクスチャが含まれています テクスチャ圧縮を使用すれば より多くのテクスチャを メモリに読み込め 詳細なテクスチャを使用することで 視覚的により感動的なゲームを制作できます また 圧縮は Appのサイズとメモリ フットプリントを削減します 基本について説明したところで Appleプラッフォームの圧縮ツールの現状況を お知らせします iOS SDKの既存のTextureToolの パイプラインは比較的シンプルです TextureToolは入力画像を読み込み 必要に応じてミップマップを生成し ブロックごとにテクスチャを圧縮し 新しい出力ファイルに結果を書き込みます しかしグラフィックスの アルゴリズムが複雑になると より高度なテクスチャの処理が必要となります これらの処理は正確な色空間で 演算を実行しながら 数値精度の間の変換の四捨五入を 最小限に抑えます これを把握するために TextureConverterという 高度なテクスチャ処理の必要性に対処し 多くの新しいオプションへの アクセスを提供する 新しい圧縮ツールを設計しました 我々がAppleプラッフォームの テクスチャ処理パイプラインを どのように改良したかを ご覧ください テクスチャ処理パイプラインは 一から再構築され TextureConverterで 完全機能のテクスチャ処理パイプラインに アクセス可能になりました TextureConverterは 業界で高く認識されている一連の圧縮機を活用し 広範囲の圧縮形式をサポートし 圧縮速度と画像品質の間で トレードオフを提供します 圧縮機を指定するか TextureConverterが圧縮形式 品質レベルやその他のオプションを基に 選択することもできます それぞれのステージは皆さんが完全に設定でき ガンマを意識したテクスチャ処理を行います すべての統合をサポートするために TextureConverterはmacOSと Windowsの両方で利用可能で Apple Siliconの使用に 最適化されています 拡大されたパイプラインの 各ステップを見てみましょう ガンマから始めます ガンマ補正は非線型演算で 画像の輝度のエンコードとデコードを行います テクスチャは多くのガンマ 空間でエンコードできます 最適な選択はテクスチャが表す データの種類によります デカールやライトマップなど ほとんどの視覚データは RGBなどの非線型空間でエンコードされるのが 最適です ノーマルマッピングなど非視覚データは 線型空間でエンコードされるべきです この選択は 必要な場合暗い領域で 精密性を提供します ノーマルマッピングなどの非視覚データは 線型空間でエンコードされるべきです 圧縮は目標の色空間で“gamma_in” “gamma_out”と指定して 実行されるべきです 線型空間に フロート値を入力するか “sRGB”ストリングを使用し 色空間を指定します 異なる目標空間の変換にも これらのオプションを使用する柔軟性があります ミップマップ生成などのその他の演算は 線型空間で実行されるべきです では線型空間の処理ステージをご説明します
入力が線型ガンマ空間に変換されたところで 線型空間演算は入力テクスチャが 指定の目標ガンマ空間に変換される前に 実行されます 3つのステージは物理的変換 ミップマップ生成 アルファ処理で サブステージがあるものもあります 物理的変換から始めましょう 最大サイズを軸に定義することで 必要に応じて 高水準の ミップマップ向けに画像を縮小できます このステージではリサイズフィルタと リサイズ丸めモードの調整が可能です リサイズフィルタは異なるアルゴリズムを使用し 寸法を縮小する際のミップマップの不鮮明さの 削減をサポートします リサイズ丸めモードは 画像のサイズを変更する際に max_extentと共に使用されます max_extentを超えた場合 ソース画像は 元の画像サイズを維持しサイズが変更されます 丸め指定モードは 目標の次元を見つける場合に使用されます どの機能を使用すればいいかわからない場合は ほとんどのケースに適合する デフォルトモードがあります そしてこのステージのflipオプションなら X Y G軸の線型変換を 完全に操作できます 変換完了後はミップマップ生成です これは 一般的なテキスチャ処理に使用されます ミップマップは事前計算された画像配列で その配列で解像度を下げレンダリングの高速化と エイリアシングの削減に使用します 各レベルの高さと幅は 前レベルよりも2の累乗小さくなります
ミップマップ生成をカスタマイズする場合 希望の最大数と 使用するミップフィルタを指定します TextureConverterは カイザーを使用し “box”と“triangle”の オプションがあります
線型処理の最後のステージはアルファ処理です
alpha to coverageが 有効になると 指定したアルファレファレンス値を使用し これが最初に適用されます Alpha to coverageは カバレッジマスクでアルファブレンドを置換え アンチエイリアシングか 半透明テキスチャが使用された場合 order-independent transparencyを使用でき ゲームで密度の高い緑地を レンダリングする際に便利です この後アルファチャンネルの放棄 保存 プリマルチプライオプションが表示されます プリマルチプライアルファでは 画像の部分的に透明なピクセルは マットカラーでプリマルチプライされます
線型空間ステージの終了時に 目標のガンマ空間に戻り 処理されたミップレベルを圧縮する準備ができます
テキスチャ圧縮の最後のステップは 圧縮です 圧縮ステージはチャネルマッピングと エンコーディングの 2つの サブステージに分割できます チャネルマッピングは 一般的な目的のテキスチャ圧縮アルゴリズムを 特定のデータ種類に最適化する技術です
TextureConverterでの 指定はオプションです TextureConverterを 使用したい場合は現在 RGBMとノーマルマッピングエンコーディングの 2つのモードをサポートしています 両方のフォーマットを詳細に説明しましょう まずはRGBMエンコーディングから RGBMエンコーディングはアルファチャネルで マルチプライヤを保管して このマルチプライヤでRGBチャネルを スケーリングしHDRデータを圧縮する技術です こちらは教室のHDR画像の例です こちらは同じ教室の画像ですが アルファチャネルにマルチプライヤが保管され グレースケールで表示されています RGBMをエンコードするために マルチプライヤを計算する 方法を コードで説明します EncodeRGBMは簡素化された 擬似コードの関数です RGBMエンコーディングの仕組みを 理解できるよう詳細にご説明します このスニペットはRGBMの範囲を デフォルトの6.0に設定する 真新しいパラメーター RGBM_Rangeを含んでいます RGBMアルファ値マルチプライヤを 計算するために まず入力テキスチャの 赤 緑 青のチャネルの最大を判断します これはMetalのmax3関数で行います 次にこの最大が RGBM_Rangeで除算されます エンコードされたRGBMの 赤 緑 青チャネルの値を計算するには まず以前に計算されたマルチプライヤが アルファチャンネルのストレージの値を スケーリングするのに使用された RGBM_Rangeで乗算され直します 次に入力テキスチャが 最終マルチプライヤ値で除算されます シェーダーのRGBMをデコードするには エンコーディング関数でお見せしたように サンプルのRGBをアルファと 固定係数で乗算します DecodeRGBMコードスニペットで このやり方をお見せします 基準化因子はRGBM_Rangeにより マルチプライヤが保管されている RGBMアルファチャネルを 乗算して再計算されます 元のテキスチャのRGBは 計算されたマルチプライヤで RGBMサンプルを乗算して 計算されます RGBMエンコーディングをご紹介したところで ノーマルマッピングエンコーディングに移ります ノーマルマッピングについて 言及する場合 ほとんどは object-space normal mapsを意味しています object-spaceでノーマルを エンコーディングする場合 各ノーマルは単位ベクトルで これには2つの軸を表しランタイムで3つ目の軸を 自明に誘導できるというメリットがあります これによりテクスチャ圧縮アルゴリズムを 最大限に活用するための この2つのチャネルのリマッピングが可能になり XYZをRGBとして圧縮するよりも はるかにすばらしい圧縮を実現できます チャネルのリマッピングの方法は 圧縮形式により異なります このチャートをガイドとしてASTCでノーマルを エンコーディングする例をお見せしましょう ASTCでエンコーディングする場合 赤 緑 青のチャネルは X成分に設定され アルファチャネルはY成分に設定されます 色は エンコードされたノーマルを サンプルする際にXとY成分が 再割り当てするチャネルに対応します TextureConverterは ノーマルマップの パラメータをパスした場合選択した形式に自動的に エンコーディングをリマッピングしてくれます シェーダーでノーマルをサンプリングする場合 チャネルマッピングを知っておくのは重要です X成分は赤かアルファチャネルから読み込まれ Y成分は圧縮形式によってアルファか 緑のチャンネルから読み込まれます ASTCの例から戻り テクスチャをサンプルする場合 ノーマルのエンコード方法とは逆に X成分は赤のチャネルからY成分は アルファチャネルからサンプリングされます すべてのデバイスで可能な限り最高の品質を 達成するために複数の形式に エンコーディングする場合ランタイムで このマッピングに対処する必要があります ではランタイムノーマルサンプリングの例を Metal texture swizzlesを 使ってお見せします 複数の形式へのエンコーディングは 異なる形式が異なるチャネル マッピングを使用する場合 複数のシェーダー変数につながる場合があります これを回避するために テクスチャにカスタム Swizzlesを適用できます Swizzlesを使えばXとY成分を 赤と緑のチャネルにリマッピングできるので シェーダーはニュートラルな圧縮形式になれます これは先ほど図形でお見せした ASTCで圧縮された ノーマルマップの赤と緑への チャネルのリマッピングの例です テキスチャ記述が起動した後 赤のチャネルは MTLTextureSwizzleRedに 緑はMTLTextureSwizzle Alphaに設定されます
これはノーマルマップなので サンプリングに必要なチャネルは2つのみです 赤と緑のチャネルは 元々 赤とアルファチャンネルに エンコードされた XとY成分に割り当てられたため 青とアルファチャネルは0に設定されています これが完了したら 最後の行は MTLTexture SwizzleChannelsMakeを 使いリマップされたチャネルで 最後のSwizzleをアセンブルするものです XとYチャネルが シェーダーにサンプルされたら Z成分を再構築できます ReconstructNormal関数の 方法をお見せしましょう
まずコードはXとY成分を正確な範囲に 再バイアスします 通常これは -1~1です 次のステップは1からXとY成分の ドット積を減算し ドット積の結果が正確な サインであるかを確認します 次に 0~1の範囲の この結果を固定するために 飽和度関数が使用されます 最後のステップのZ成分の計算は 飽和度関数の出力の平方根を 取ることです
ではチャネルマッピングで 利用可能なRGBMとノーマルマップ エンコーディングを説明したところで 最後に テキスチャ圧縮パイプラインと 最終圧縮サブステート エンコーディングについてお話しします すべてのTextureConverter コマンド行には 目標圧縮形式の指定と compression_formatの 引数が必要になります 仕様する圧縮機を指定するか 選択した圧縮形式と その他のオプションの基づき TextureConverterに 選択させることも可能です また 4つのオプションから 圧縮の質を選択することもできます 圧縮速度と画像品質のトレードオフが 生じることにご注意ください また ゲームでイテレーションを行う場合は 低品質の圧縮を選んでも構いませんが リリース用には最高品質を 選ぶことをおすすめします では選択可能な圧縮形式を ご紹介しましょう
こちらが Appleプラッフォームでサポートされている 圧縮形式の一覧です iOSとApple Silicon platformは ASTCとPVRTC系をサポートし macOSプラッフォームは BCn系をサポートします 各形式系の詳細を説明し ニーズに適った製品を選択するための ガイドラインをご提供します まずはBCn形式から BCnは7つの形式からなり すべて4x4ピクセルブロックと 各ピクセルに4または8ビット使用して演算します 各形式は異なるデータ形式に適合します BCとBC3は一般的に RGBとRGBA圧縮に使用され BC6はHDR画像向け 個別のデュアルチャネルが付いたBC5は 通常のマップエンコーディングに最適です 次は ASTCです LDR sRGBHDR色空間系の RGBA形式です この形式はあらゆるサイズに対し 最高品質を提供するので PVRTCよりも一般的に推奨されています 各形式の品質に対し ピクセルごとのビット範囲があります
ASTCなら各ブロックのバイトサイズは 形式に関係なくすべて同じですが 表示するテキスト数は異なります これは最高品質の圧縮の間で 連続体を提供してくれますが 4X4のブロックサイズで 最低圧縮率を提供し 最低圧縮品質に対し 12X12ブロックサイズで 最高圧縮率を提供します LDR sRGB HDR変数は 圧縮されたASTCテキスチャの 色の範囲を説明します LDRとsRGBは共に0~1の範囲で 線型またはsRGB空間です 一方でHDR変数は 0~1範囲外のデータ用です
最後に PVRTC形式は 2または4ビットモードの RGBとRGBAで利用可能です この形式のデータブロックは 常に8バイト占有するので 2ビットモードの場合各8X4ピクセルに対し 1ブロックとなり 4ビットモードでは 各4X4ピクセルに対し1ブロックとなります
対応の形式系をご紹介したところで 推奨の形式を ご紹介します iOSデバイスにはデフォルトで ASTC圧縮をご使用ください A7 GPU以前をサポートする場合のみ PVRTC圧縮と デバイスごとの細線化を追加します HDRテクスチャがある場合は A13とそれ以降のGPUで ASTC HDRを活用できます macOSでは全体的に BCnをご利用いただけます Apple Silicon Macでは ASTCを使用するオプションもあります iOSデバイスをターゲットにする場合は このオプションを考慮するべきでしょう PVRTCはApple Siliconでも ご利用いただけますが このオプションは推奨しません これは iOSレガシーサポート向けです 各圧縮形式系には さまざまな形式があり Appに最も効果的なテクスチャ圧縮形式を 選択するためのガイドラインは per-textureとper-targetで 選択することです テクスチャがすべて RGBかRGBAデータでない限り ノーマルデータ向けに2つの個別のチャネルの 圧縮を可能にするなど 圧縮するデータの種類に基づき 圧縮形式を選択するべきです ASTC形式に圧縮する場合 形式のサブセットを選択しましょう 高度の圧縮率ではなく 最高品質のテクスチャを必要とするものには バケットテクスチャを考慮します では おさらいです 我々はTextureToolから テクスチャ処理パイプラインを再構築し 新しいTextureConverter ツールでパイプラインの すべてステージを完全に制御できるようにしました この新しいパイプラインの各ステージを説明し 各ステージで使用できる オプションと Appleプラッフォームでサポートされている テクスチャ圧縮形式系統と チャネルマッピングをご紹介しました TextureToolから TextureConverterへと ワークフローの更新をできるだけ簡単にするため コマンド行の切り替えに役立つ 互換モードを追加しました TextureTool互換モードを使用しても TextureConverterを ネイティブとしても xcrun Texture Converterを呼び出せます こちらはTextureToolで呼び出された TextureConverterの コマンド行の例です TextureConverterはオプションを ネイティブの TextureConverterに変換し 圧縮してから 新しいネイティブオプションを伝えるので ビルドスクリプトを簡単に更新できます
TextureConverterのご紹介でした ご購入方法は以下の通りです TextureConverterは Xcode 13の一部として Seed 1で利用可能になります Windowsでは TextureConverterは Windows 2.0パッケージの Metal Developerの一部となり developer.apple.comから ご購入いただけます Seed 1は現在販売中です WindowsではPVRTC形式はの圧縮は サポートされていないことにご留意ください PVRTCはmacOSの 旧式のiOSプラッフォームの サポート用だからです Windows用 Metal Developerの もう1つ重要なのは Windows用 Metal Compilerです この製品は Metal Shading Language version 2.3と 共に 去年発売され Xcodeで販売されたMetalコンパイラの 更新に合わせて 1年を通じ更新されます 最新バージョンは1.2で Apple Silicon Macsの Metal Shading Language サポートが含まれています version 2.0のSeed 1が 現在利用可能で Metal Shading Language 2.4の すべての新機能のサポートを提供しています
では本日のトークの要約です EGorはレイトレーシング関数ポインタなど Metal機能のサポートさらに すべてのAppleプラッフォームで GPUを最大限に活用するための 新しいプロファイリング ワークフローをご紹介しました シェーダー検証と精密なキャプチャ制御に対し より優れたサポートを提供するための デバッギングワークフローの 改善のデモも行いました 私はテクスチャ処理パイプラインを 活用するのに役立つ TextureConverterと Appleプラッフォームで利用可能なすべての テクスチャ圧縮形式をご紹介しました ありがとうございます WWDC 2021をお楽しみ下さい [音楽]
-
-
27:51 - RGBM Encoding Pseudocode
float4 EncodeRGBM(float3 in) { float4 rgbm; rgbm.a = max3(in.r, in.g, in.b) / RGBM_Range; rgbm.rgb = in / (rgbm.a * RGBM_Range); return rgbm; }
-
28:41 - RGBM Decoding Pseudocode
float3 DecodeRGBM(float4 sample) { const float RGBM_Range = 6.0f; float scale = sample.a * RGBM_Range; return sample.rgb * scale; }
-
30:55 - MetalTextureSwizzles
// Remap the X and Y channels to red and green channels for normal maps compressed with ASTC. MTLTextureDescriptor* descriptor = [[MTLTextureDescriptor alloc] init]; MTLTextureSwizzle r = MTLTextureSwizzleRed; MTLTextureSwizzle g = MTLTextureSwizzleAlpha; MTLTextureSwizzle b = MTLTextureSwizzleZero; MTLTextureSwizzle a = MTLTextureSwizzleZero; descriptor.swizzle = MTLTextureSwizzleChannelsMake( r, g, b, a );
-
31:55 - ReconstructNormal
// Reconstruct z-axis from normal sample in shader code. float3 ReconstructNormal(float2 sample) { float3 normal; normal.xy = sample.xy * 2.0f - 1.0f; normal.z = sqrt( saturate( 1.0f - dot( normal.xy, normal.xy ) ) ); return normal; }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。