1

iOS用の画像を処理するためにCPUベースのプログラムで実行している方程式がいくつかあります。出力は次の形式です。

for (y = 0; y < rows; ++y){
  for (x = 0; x < cols; ++x){
    <do math>
    outputImage[y*cols + x] += <some result>
    outputImage[y*cols + (x+1)] += <some result>
    outputImage[(y+1)*cols + x] += <some result>
  }
}

このコードは、おそらくGPUImageを介してGPUにスローできる(そしてスローする必要がある)と思います。秘訣は出力です。私の理解では、シェーダーの結果のみをgl_FragColorに入れることができます。結果を出力の複数のピクセルに配置するフラグメントシェーダーを作成することは可能ですか?そのテクニックの例はどこにありますか?

4

1 に答える 1

1

出力の複数のピクセルに結果を配置するフラグメント シェーダーを作成することは可能ですか?

いいえ。シェーダーは個別に動作するように設計されています。それが彼らがとても速い理由です。

アルゴリズムを「シェーダーに適した」ものにリファクタリングする必要があります。入力を抽出して、単一のフラグメントの単一の値を計算するアルゴリズムにフィードできるようにしてください。分岐とループを避けるようにしてください。さもなければ、計算を CPU に保持することをお勧めします。

<do math>入力として x と y を取ると仮定すると、これらはgl_FragCoordから取得できます。<some result>シェーダー プログラムの出力は次のように<do math>なります。

vec4 location = getLocation(gl_FragCoord);
gl_FragColor += do_math(location.x, location.y);
gl_FragColor += do_math(location.x-1, location.y);
gl_FragColor += do_math(location.x, location.y-1);

足し算ではなく引き算に注意してください。このように、フラグメントは、隣人を変更するのではなく、それ自体の値を完全に計算しています。

于 2013-01-05T15:54:28.723 に答える