ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Core Imageカーネルの改善点
Metal Shading Language で書かれた Core Image カーネルをAppに追加する方法を確認します。Metal Shading Languageで記述されたCore ImageカーネルのためにXcodeルールと命名規則をどのように使用するかを検討し、Core Imageカーネルに役立つMetalのStitchable関数とダイナミックライブラリ機能を理解できるようにします。
リソース
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
♪ (Core Imageカーネルの改善点) みなさん ようこそ 私はDavid Haywardです 私は Core Imageチームの上級エンジニアです そして今日はXcodeプロジェクトに Metal Core Imageの カスタムカーネルを追加する際の 最新のベストプラクティスを紹介する 短めのプレゼンテーションを行います このプレゼンテーションではMetalで カスタムCIカーネルを書く一般的な メリットについて説明します 次に Metal CIKernelsを構築するために 推奨される2つの方法を紹介します そして これらをプロジェクトに 追加する方法を順を追って説明します まず最初にMetalで カスタムCIKernelsを書くこと のメリットを確認しましょう MetalでCIKernelsを書くことで 自動タイリングや連結などの Core Imageの機能にアクセスできるようになります カーネルのコンパイルに かかる時間の一部をランタイムからAppのビルド時に 移行することで Appのパフォーマンスが向上します そうすることでカーネルは gather-reads group-writs half-float mathなどの ハイパフォーマンス機能にアクセス できるようになります 大事なことを言い忘れてましたが 入力時のシンタックスハイライトや ビルド時のインラインエラーチェックにより 開発者の生活をより快適にしてくれます ではいいモチベーションで ここからはMetal Core Imageカーネルを Appに追加する方法を順を追って説明します CIKernelsをプロジェクトに追加するには 現在 2つの方法が推奨されていますので 両方の方法を詳しく説明します カーネル関数をextern 「C 」として指定し カスタムビルドフラグを使用して ビルドする必要があるためここでは extern方式と呼ぶことにします 2つ目の方法は iOS 15と macOS 12で新たに採用されました カーネル関数がstitchableとして 帰属していることが必要なので これをstitchable法と呼ぶことにします Metal Dynamic Librariesが その実装に使用されています どちらの方法でも一般的には4つの ステップを踏むことになります まずは プロジェクトを適切に設定することです 次にMetal CIKernelソースファイル をプロジェクトに追加します 3つ目はMetal CIKernelコードを書くことです 4つ目はSwiftやObjective-Cコードを書いて カーネルを初期化して適用し 新しいCIImageを作成します まずextern CIKernelsを使用する際の 4つのステップを プロジェクトの設定から説明します このCore Image Metalのコードは 従来のMetalのコンピュートや グラフィックシェーダとは異なり 特別なフラグを立てて コンパイルやリンクする必要があります プロジェクトターゲットに2つの カスタムビルドルールを追加して これらのフラグを自動的に 使用することをお勧めします まず プロジェクトのターゲット設定で .ci.metalで終わるファイルに 対するビルドルールを追加します この拡張子のファイルに対して このルールは必要な-fcikernel フラグを指定して Metal コンパイラを呼び出す 1 行のスクリプトを実行します このビルドルールでは出力バイナリは .ci.air で終わります 次に .ci.airで終わるファイルを対象とした 2つ目のビルドルールを追加します この拡張子のファイルに対して このルールは必要な-cikernel フラグを指定して Metal リンカを呼び出す 1 行のスクリプトを実行します このビルドルールでは AppのResourcesディレクトリに .ci.metallibで終わる出力が生成されます これで カスタムビルドルールを 追加することができましたので あとは .ci.metalのソースをプロジェクトに 追加するだけです そのためにはFileメニューから 新しいMetalファイルを追加することを選択し その新しいファイルに .ci.metalで終わる名前をつけます 次のステップではCIKernelを Metalソース・ファイルに書きます まず ソースの一番上に CoreImage.hというヘッダーをインクルードし Core Imageが提供するすべてのクラスに アクセスできるようにします Core Imageが認識するためにはカーネルを extern 「C」として指定する必要があります 実際のカーネル実装の内容は あなたの想像力にお任せします できることの一例として 「AVFoundationを使用したHDR動画の編集と再生 」 という WWDC 2020のプレゼンテーション をご覧になることをお勧めします 最後のステップはカーネルをロード するためのSwiftコードを追加し それを適用して新しいイメージを作成することです カーネルは通常CIFilter のサブクラスで使用され inputImage やその他の入力パラメータなどの プロパティを持ちます フィルターはCIKernelオブジェクト をスタティック型のプロパティに インスタンス化することをお勧めします これにより metallibリソースの読み込み作業は 最初に必要になったときに一度だけ行われます 先ほど説明したカスタムビルドルールの関係で ソースと同じ名前で 拡張子が.ci.metallibの リソースURLを指定する必要があります 最後にCIFilterのサブクラスは outputImage プロパティを オーバーライドする必要があります ゲッターでは スタティック型のプロパティから カーネルを取得しその適用メソッドを使って 入力されたプロパティに基づいて 新しい画像を作成します 以上 extern CIKernelsの 構築方法をご紹介しました それでは stitchable なCIKernelsを 構築するための新しいプロセスについて説明します stitchable方式では Xcodeプロジェクトの設定変更は 1回だけで済みます この設定は Core Imageフレームワークに対して リンクするようMetalリンカーに指示します これを行うにはプロジェクトの ターゲット設定にアクセスし 「Other Metal Linker Flags」のビルド設定に 「-framework CoreImage」という値を追加します stitchable CIKernelsは カスタムビルドルールを必要としないため 特別なサフィックスなしで.metalソースを 簡単にプロジェクトに追加することができます カーネルは1つまたは複数のソース ファイルに追加することができます デフォルトでは Xcodeはそれらすべてを1つの .metallibリソースにビルドします 次のステップではCIKernelを Metalソース・ファイルに書き込みます 前述のようにCore Imageクラスにアクセスするには CoreImage.hヘッダーをインクルードします しかしこの方法ではCore Imageで認識するためには カーネルがstitchableであることが前提となります 繰り返しになりますが 最後のステップはカーネルをロード するためのSwiftコードを追加し それを適用して新しいイメージを作成することです stitchable CIKernelsの唯一の変更点は デフォルトの.metallibという 標準的な名前のリソースを 単純にロードすることです 以上でstitchable CIKernelsを 構築するプロセスを終了します この方法を使うことで いくつかの利点があることを述べておきます Stitchableカーネルは他の Metalライブラリとリンクできます また入力パラメータとして 整数および符号なし整数の ベクトル型をサポートするようになりました もう1つの特定分野の利点はstitchableカーネルが ランタイムにソースからコンパイルできることです この機能は最初のコンパイル時間が長くなるため ほとんどのAppでは使用しないでください そうは言っても中にはこの順応性から恩恵を受ける Appのクラスもあります このプレゼンテーションでは最後に もう1つトピックを紹介します stitchable CIKernelの実装は 2つの重要なMetalの機能によって決まります 1つ目は Metal Shader Language の新しいバージョン2.4です 数ある中でも このバージョンではstitchable属性 がサポートされており コンパイラが各関数に追加のメタデータを 関連付けるようになっています 2 つ目はMetal Dynamic Libraries機能です これは カーネルがCore Image Metalクラスに リンクできるように使用されます これらのMetalの機能の詳細に ついては プレゼンテーションの 「Metalのコンパイルワークフロー」をご覧ください ただしメタルダイナミックライブラリは 一部の グラフィックスデバイスでしか サポートされてなく 要注意です 具体的にはA11以降のiPhoneとiPad Apple Siliconを搭載したすべてのMac AMD NaviおよびVega GPUを搭載したIntel製Macです titchable CIKernelsを使用する前にAppは Metalデバイス・プロパティの supportsDynamicLibrariesを チェックする必要があります 以上で Metal CIKernelsをAppに 追加するために推奨される2つの方法について 順を追った説明を終わります それぞれの方法についてプロジェクトの設定 カーネルソースの記述 カーネルオブジェクトの初期化 の方法を説明しました このことでAppの画像や動画に素晴らしい視覚効果を 加えることができるようになるといいですね ありがとうございました 引き続き WWDC 2021をお楽しみください ♪
-
-
3:54 - Extern CIKernels
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h using namespace metal; extern "C" float4 myKernel (coreimage::sample_t s, float param, coreimage::destination dest) { float4 result = s; // Example code to create striped pattern float diagLine = dest.coord().x + dest.coord().y; float stripe = fract(diagLine/20.0 + param*2.0); // Color range check if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1))) result = float4(2.0, 0.0, 0.0, 1.0); return result; }
-
4:32 - Load your extern CI kernel and apply it to create a new image
class MyFilter: CIFilter { var inputImage: CIImage? var inputParam: Float = 0.0 static var kernel: CIColorKernel = { () -> CIColorKernel in let url = Bundle.main.url(forResource: "MyKernels", withExtension: "ci.metallib")! let data = try! Data(contentsOf: url) return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data) }() override var outputImage : CIImage? { get { guard let input = inputImage else { return nil } return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) } } }
-
6:18 - Stitchable CI Kernel
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h using namespace metal; [[stitchable]] float4 myKernel (coreimage::sample_t s, float param, coreimage::destination d) { float4 result = s; // Example code to create striped pattern float diagLine = dest.coord().x + dest.coord().y; float stripe = fract(diagLine/20.0 + param*2.0); // Color range check if((stripe > 0.5) && ((s.r > 1) || (s.g > 1) || (s.b > 1))) result = float4(2.0, 0.0, 0.0, 1.0); return result; }
-
6:40 - Load your stitchable CI kernel and apply it to create a new image
class MyFilter: CIFilter { var inputImage: CIImage? var inputParam: Float = 0.0 static var kernel: CIColorKernel = { () -> CIColorKernel in let url = Bundle.main.url(forResource: "default", withExtension: "metallib")! let data = try! Data(contentsOf: url) return try! CIColorKernel(functionName: "MyKernel", fromMetalLibraryData: data) }() override var outputImage : CIImage? { get { guard let input = inputImage else { return nil } return MyFilter.kernel.apply(extent:input.extent, arguments:[input, inputParam]) } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。