ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Xcodeを使用したMetalベースCore Imageカーネルの作成
Metal Shading Languageで書かれたCore ImageカーネルをAppに統合してロードする方法について学びます。また、これらの画像フィルタを適用して独自のエフェクトを作成する方法についても説明します。Metal Shading Languageで書かれたCore ImageカーネルのXcode規則と命名規則の使用方法を紹介します。MetalおよびMetal Shading Languageを用いて、Core Image APIを効果的かつ最適に使用する方法について説明します。
リソース
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ
“Xcodeを使用したMetalベースCore Image カーネルの作成” 私はデヴィッド・ヘイワード Core Imageチームのエンジニアです 今日 ご説明するのは MetalベースのCore Imageカーネルを Xcodeでビルドする方法です カスタムCIKernelをMetalで書く利点とは? 1つはCIKernelの標準機能である― 自動タイリングや連結などが 使えること また Metalで書けば― アプリケーション構築時に作業を移行し runtime compile timeを削減できます gather readsやgroup writes half float mathなどの高度な機能も利用可能で 入力時のシンタックスハイライトや ビルド時のシンタックスチェックにより 開発効率がアップします
これらの利点を踏まえ MetalベースのCore Imageカーネルを アプリケーションに追加する方法を説明します 手順は5つです プロジェクトにカスタム構成ルールを追加する プロジェクトに.ci.metalソースを追加する カーネルを書く CIKernelオブジェクトを初期化する そしてカーネルを適用して 新しいCIImageを作る 従来のコンピュートシェーダーや グラフィックシェーダーと違い Core ImageのMetalのコードは特殊フラグに コンパイルしリンクする必要があります 2つのカスタム構成ルールを プロジェクトのターゲットに追加し フラグを自動で使うのがいいでしょう
まずプロジェクトのターゲット設定で 末尾が.ci.metalのファイルに 1つ目の構成ルールを追加します この拡張子のファイルには fcikernelフラグ付きのMetalコンパイラを 呼び出す1行スクリプトを実行します この構成ルールは .ci.airで終わる出力バイナリを生成します 次に.ci.airで終わるファイルに 2つ目のルールを追加します この拡張子のファイルには cikernelフラグ付きのMetalリンカを 呼び出す別の1行スクリプトを実行します
この構成ルールはアプリケーションの リソースディレクトリに― .ci.metalで終わる出力を生成します
カスタム構成ルールを追加したら プロジェクトに.ci.metalソースを追加します 「ファイル」メニューで “新規”“ファイル”を選択し “Metalファイルを追加する”を選択
末尾が.ciのファイル名を作成します これでプロジェクトの新規ファイルは 末尾が.ci.metalになります 今日 お見せするカーネルは “Edit and Playback HDR Video With AVFoundation”のプレゼンでも示されたものです
このカーネルはHDRビデオの 明るい拡張範囲を強調する― アニメーション化された ゼブラストライプエフェクトを適用します
このエフェクトのカスタムCIKernelを 書くのは簡単です ソースの一番上にCoreImage.hヘッダを インクルードします これで普通のあらゆるMetalクラスと― Core Imageが提供する追加のクラスに アクセスできます
次はカーネルの関数を宣言します extern "C"です 例はCIColorKernelです 関数はfloat4ピクセルを返し 引数を取ります
最初の引数はcoreimage::sample_t これは入力画像のピクセルを表します このピクセルはリニアで プリマルチプライされたRGBA float4です SDRまたはHDR画像に適しています
最後の引数はcoreimage::destinationです ピクセルの座標を与えて返します このカーネルの実行には dest.coord().xとdest.coord().y値を使い どの対角線にいるかを決定します そしてゼブラストライプを使うべきか否かを 簡単に計算します ゼブラストライプを使い 現状のピクセルサンプルが 普通のSDRwhite of 1より明るい場合 明るい赤のピクセルを返します そうでなければ入力サンプルを 変更せずに返します Core Imageカーネルの Metal Shading Languageについての詳細文書は developer.apple.comにて PDF形式でダウンロードできます MetalベースのCore Imageカーネルのクラスや gather readsやgroup writesなどの より高度な機能も記載されています ご説明する最後のステップは カーネルをロードし適用して 新しい画像を作るSwiftコードにあります 通常 カーネルを使うのは CIFilterサブクラスで inputImageや他のパラメータのような inputプロパティを持ちます
静的プロパティを使い フィルタで CIKernelオブジェクトをインスタンス化すれば コンパイルされたmetallibリソースが 最初に必要な時だけロードされます
最後にCIFilterサブクラスにoutputImage プロパティをオーバーライドさせます このゲッターでは 静的プロパティからカーネルを取り そのapplyメソッドで 新しい画像を作ります
XcodeでMetalベースのCore Imageカーネルを ビルドする手順は以上です プロジェクトにカスタム構成ルールを追加する カーネルを書いてプロジェクトに追加する そしてCIKernelオブジェクトを初期化し 適用して新しい画像を作る この手順がアプリケーションの画像やビデオに 最高の視覚効果をもたらすでしょう ご視聴ありがとうございました
-
-
3:08 - Put your kernels in .ci.metal sources
// MyKernels.ci.metal #include <CoreImage/CoreImage.h> // includes CIKernelMetalLib.h using namespace metal; extern "C" float4 HDRZebra (coreimage::sample_t s, float time, coreimage::destination dest) { float diagLine = dest.coord().x + dest.coord().y; float zebra = fract(diagLine/20.0 + time*2.0); if ((zebra > 0.5) && (s.r > 1 || s.g > 1 || s.b > 1)) return float4(2.0, 0.0, 0.0, 1.0); return s; }
-
4:58 - Loading your kernel and applying it to create a new image
class HDRZebraFilter: CIFilter { var inputImage: CIImage? var inputTime: 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: "HDRzebra", fromMetalLibraryData: data) }() override var outputImage : CIImage? { get { guard let input = inputImage else {return nil} return HDRZebraFilter.kernel.apply(extent: input.extent, arguments: [input, inputTime]) } } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。