4

iPhoneアプリのGLSLシェーダー(カメラからの画像のキャプチャ)を使用して、画面の中央ピクセルにPhotoshopの「魔法の杖」のような効果を作成したいと思います。これを作成するには、ピクセルの配列を取得し、中央のピクセルに何らかのフラッドフィルアルゴリズムを適用します(すべてObjective-Cコードを使用)。これはCPUで実行されますが、これは私には少し遅すぎるので、GLSLシェーダーを使用して作成してみたいと思います。

実際に必要なのは、フラグメントシェーダーのフラッドフィルを書き直して、現在のフラグメントの色がしきい値の色に近いかどうか、現在のフラグメントが以前に検出されたエリア内のフラグメントの隣にあるかどうかを確認することだけです。それは私には混乱しすぎて、それが可能かどうかさえ理解できません。

フラッドフィルのアルゴリズムは(擬似コード)です。

Flood-fill (node, target-color, replacement-color):
 1. Set Q to the empty queue.
 2. If the color of node is not equal to target-color, return.
 3. Add node to Q.
 4. For each element n of Q:
 5.     If the color of n is equal to target-color:
 6.         Set w and e equal to n.
 7.         Move w to the west until the color of the node to the west of w no longer matches target-color.
 8.         Move e to the east until the color of the node to the east of e no longer matches target-color.
 9.         Set the color of nodes between w and e to replacement-color.
10.         For each node n between w and e:
11.             If the color of the node to the north of n is target-color, add that node to Q.
12.             If the color of the node to the south of n is target-color, add that node to Q.
13. Continue looping until Q is exhausted.
14. Return.

質問:シェーダーでそれを行うことは可能ですか?はいの場合、どうすればそれを行うことができますか?

ありがとう!

4

1 に答える 1

3

いいえ、シェーダーはそのようには機能しません。シェーダーでは、常に読み取りまたは書き込みのみを行うことができ、両方を同時に行うことはできません。アルゴリズムを振り返ると、同じデータの読み取りと書き込みが行われます。

あなたはピンポンスキームを試すことができますが、私はそれが速いとは思えません:

for ( sometime )
  for (every pixel in dest) 
    if source has filled neighbours (up,left,top,bottom) and is above threshold, then write fill
    else write source
  flip source and dest

これにより、反復ごとに1ピクセル多くステップ実行されますが、実行されるタイミング(画像サイズ)には上限しかありません。

さらに賢くして、ネズミ講を試してみることができます。最初に2倍低い解像度で実行し、それを使用して塗りつぶしの領域を決定します。しかし、それは実際にはGPUでうまく機能するアルゴリズムではありません。代わりに、手動で最適化されたアセンブリCPUバージョンを実行することをお勧めします。

于 2012-10-04T05:03:31.470 に答える