2

GPUImageライブラリは初めてです。

私はそれを使ってカメラからフレームを取得し、それらをリアルタイムでフィルタリングしています。開発中のフィルターに異なるフィルターパラメーターを使用しています。

さまざまなフィルターと並行してカメラ画像をフィルター処理する方法を理解しましたが、ここで実行したいのは、4つのフィルター処理された画像を並べて大きな出力画像を作成する結果画像を出力することです。

私の考えでは、GPUImageTransformFilterインスタンスとGPUImageAddBlendFilterインスタンスをチェーンして、合成されたイメージを取得できます。たとえば、2つの画像を縮小して並べるという最も単純なケースでは、次のようになります。

self.transform1 = [[GPUImageTransformFilter alloc] init];
_transform1.affineTransform = CGAffineTransformScale(CGAffineTransformIdentity, 0.5, 0.5);

self.transform2 = [[GPUImageTransformFilter alloc] init];
_transform2.affineTransform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformIdentity, 0.5, 0.5), 1.0, 0.0);

self.blendFirst1 = [[GPUImageAddBlendFilter alloc] init];

[_transform1 addTarget:_blendFirst1];
[_transform2 addTarget:_blendFirst1];

ただし、これにより、両方の画像が互いに拡大縮小およびオーバーレイされ、結果は画像の端に変換され、残りの半分は空になります。

小さい画像を拡大縮小して並べて表示し、1つの大きな画像を作成する方法についてのアドバイスをいただければ幸いです。

どうもありがとう!

4

1 に答える 1

4

変換を使用してこれを行うこともできますが、4 つの画像を 1 つの静止フレームにするために 3 つのブレンドを見ています。これは、これを機能させるための最速または最もメモリ効率の高いパスにはなりません。

代わりに、GPUImageTwoInputFilter をサブクラス化するか、それに基づいてまったく新しいマルチ入力フィルターを作成し、そのフィルターを使用して 4 つの画像すべてをレンダリング用にプルすることをお勧めします。人々はこれを行うことで 3 つまたは 4 つのフィルター入力ブレンドを作成しており、おそらくそれがここでの最も効率的な方法でしょう。

フィルターのフラグメント シェーダーは、入力イメージごとに 1 つずつ、4 つのクワッドをレンダリングするか、4 つのテクスチャから選択的にサンプリングされたシェーダーを使用して、特定のピクセルで適切な色を提供します。前者の方が高速ですが、ベース ブレンド フィルターを変更する際に OpenGL ES コードをもう少し記述する必要がある場合があります。後者は、頂点シェーダーとフラグメント シェーダーに単純な微調整を使用しますが、これらのシェーダーの条件によって速度が低下する可能性があります。

于 2012-12-17T18:16:37.343 に答える