|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
図 1-5 に、2 つのソース画像を操作するフィルタのピクセル処理パスを示します。ソース画像は必ず CIImage オブジェクトとして指定します。Core Image は、画像データを取得するさまざまな手段を提供します。画像への URL を渡したり、未加工の画像データ(NSData)を読み込んだり、Quartz 2D 画像(CGContextRef)、OpenGL テクスチャ、または Core Video 画像バッファ(CVImageBufferRef)を CIImage オブジェクトに変換したりできます。
入力画像の実数、およびフィルタが入力画像を必要としているかどうかは、フィルタによって異なります。フィルタは非常に柔軟であり、次の条件に対応できます。
入力画像がなくても機能する。フィルタによっては、画像でない入力パラメータに基づいて画像を生成します。
1 つの画像を必要とする。
複数の画像を必要とする。画像を合成したり、1 つの画像の値を使用して別の画像のピクセルを処理する方法を制御するフィルタは通常、複数の画像を必要とします。1 つの入力画像が、シェーディング画像、画像マスク、または背景画像として機能したり、別の画像を処理する方法の何らかの側面を制御するルックアップ値のソースを提供したりすることが考えられます。
画像を処理するときに、適切な入力データを含む CIImage オブジェクトを作成するのは開発者の役目です。
注:CIImage オブジェクトには画像データが関連付けられていますが、オブジェクト自体は画像ではありません。CIImage オブジェクトは、画像「製法」と考えることができます。CIImage オブジェクトには画像の作成に必要なすべての情報を持っていますが、Core Image は指示されるまで実際に画像をレンダリングしません。この「遅延評価」方式(「フィルタクライアントとフィルタクリエータ」を参照)により、Core Image は最大限効率的に機能できます。
図 1-5:ピクセル処理パス
各ソース画像のピクセルは、CISampler オブジェクトまたは単にサンプラーによって取得されます。その名前が示すように、サンプラーは画像からサンプルを取り出し、それらをカーネルに渡します。フィルタクリエータは、ソース画像ごとにサンプラーを提供します。フィルタクライアントは、サンプラーについて何も知る必要はありません。
サンプラーは次のことを定義します。
座標変換。変換が必要ない場合、これは恒等変換になる可能性があります。
補間モード。最近傍サンプリングまたは双一次補間(デフォルト)のいずれかです。
ラッピングモード。サンプリング対象領域がソース画像の外である場合のピクセルの作成方法(透明の黒を使用するか、当該範囲に固定する)を指定します。
フィルタクリエータは、カーネル内にピクセル単位の画像処理計算を定義しますが、それらの計算の実行は Core Image において処理されます。Core Image は、GPU または CPU のどちらを使用して計算を実行するか決めます。CPU を使用する場合は、Velocity Engine および SMP(対称型マルチプロセッシング)の一方または両方を使用できるかどうか判断します。Core Image は、OpenGL を通じてハードウェアラスタライズ処理を実現します。また、大きな四辺形(quad)を対象とする非投影テクスチャルックアップでフラグメントプログラムを評価することを目的として調整されたエミュレーション環境で、ソフトウェアによるラスタライズ処理を実装します。
ピクセル処理パスは、ソース画像からデスティネーションに向かいますが、Core Image が使用する計算パスは、図 1-6 に示すように、デスティネーションを起点とし、ソースピクセルまでさかのぼります。この逆方向の計算は扱いにくいように思えますが、実際には計算で使用するピクセル数が最小限になります。Core Image が使用しない別の方法としては、すべてのソースピクセルを処理し、その後でデスティネーションに必要なものを決定するという総当り方式があります。図 1-6 を詳しく見てみましょう。
図 1-6:Core Image 計算パス

図 1-6 のフィルタは、ソースオーバーなど、何らかの合成操作を実行するとしましょう。フィルタクライアントは、各画像のほんの一部だけを合成して、図の左側に示す結果を達成できるように 2 つの画像を重ねることを目指します。デスティネーションのあるべき姿を予測することで、Core Image はソース画像のどのデータが最終画像に影響するかを判断し、それらのソースピクセルに計算を限定することができます。結果として、サンプラーは、図 1-6 に示したソース画像の影付きの部分からのみサンプルを取得します。
図の中で、domain of definition(定義領域)というラベルの付いたボックスに注目してください。定義領域は、計算をさらに限定する方法にすぎません。その領域以外では、すべてのピクセルが透明です(つまり、アルファコンポーネントが 0 です)。この例では、定義領域がデスティネーション画像と正確に一致しています。Core Image では、この領域を定義するために CIFilterShape オブジェクトを用意することができます。CIFilterShape は、矩形の定義、形状の変換、形状の差し込み、結合、および交差操作を実行できるいくつかのメソッドを備えています。たとえば、図 1-6 に示した影付きの領域よりも小さい矩形を使用するフィルタ形状を定義すると、Quartz はその情報を使用して、計算で使用するソースピクセルをさらに限定します。
Core Image は他の方法でも効率的な処理を推進します。インテリジェントなキャッシュ処理およびコンパイラの最適化を行うので、リアルタイムビデオ制御のようなタスクに適しています。キャッシュされるのは、繰り返し評価される任意のデータセットの中間結果です。新しい画像を追加するとキャッシュが大きくなりすぎる場合、Core Image はもっとも長く使用していないデータを追い出します。つまり、頻繁に再利用されるオブジェクトはキャッシュに残り、時々使用されるオブジェクトは必要に応じてキャッシュから出し入れされます。キャッシュ処理がどのように実装されているか知らなくても、アプリケーションは Core Image のキャッシュ処理の恩恵を受けます。ただし、可能な限りオブジェクト(画像、コンテキストなど)を再利用することで、最高のパフォーマンスを得ることができます。
Core Image はまた、カーネルおよびパスレベルで従来のコンパイル技法を使用することで、高いパフォーマンスを実現できます。Core Image がレジスタの割り当てに使用する方法は、一時レジスタ(カーネル単位)および一時 pbuffers(フィルタグラフ単位)の数を最低限します。コンパイラは CSE およびピープホール最適化を実行し、事前計算に基づいたデータ依存テクスチャの読み取りとデータに依存していないテクスチャの読み取りを自動的に区別します。この場合も、コンパイル技法の詳細を気にする必要はありません。重要な点は、Core Image がハードウェア対応であることです。可能な限り、それも賢明な方法で、GPU のパワーを利用します。
| < 前ページ次ページ > |
Last updated: Tiger
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |