2

OpenGL でレンダリングするために平面 YUVA 画像を転送する最も効率的な方法は何ですか?

現在、各フレームで 4 つの個別の PBO からアップロードする 4 つの個別のテクスチャ (Y、U、V、A) を使用しています。ただし、少数のテクスチャで大量のデータを転送する方がはるかに効率的です。たとえば、YUV422 を 1 つのパックされたテクスチャに転送すると、同じデータを 3 つ (Y、U、V) の個別のテクスチャに転送するよりも最大 50% 高速です。

この問題について私が考えたことは、(Y、A) 用と (U、V) 用の 2 つの配列テクスチャを使用できるかどうかということです。

私が検討したもう 1 つの方法は、データを PBO にコピーして転送するときに、平面からパックに変換することですが、これには CPU のオーバーヘッドが多少かかります。

助言がありますか?

注: dim(Y) == dim(A) && dim(U) == dim(V) && dim(Y) != dim(U)。

4

1 に答える 1

0

テクスチャをどのように生成しているのか疑問に思っていましたか? つまり、動的に生成されるか、ファイルからロードされますか? ファイルからロードする場合は、テクスチャを単一の rgba テクスチャとしてロードしてロードし、フラグメント シェーダを使用して yuva として処理することをお勧めします。データは一度にロードでき、パフォーマンスが大幅に向上するはずです。 .

テクスチャがどのように利用されているかについてさらに情報があれば、より詳細な回答を提供できるはずです.

編集: 私が通常 YUVA を処理する方法は、テクスチャにレンダリングすることです。GPU を使用して RGBA を YUVA に変換し、たとえばglGetTexImageを介して結果を CPU に送り返し、結果のデータを YUVA として処理します (またはアルファをドロップして YUV として使用します)。

異なるサイズのテクスチャに関しては、心配する必要はありません。適切と思われるデータをパックし、適切と思われるように読み取ります。有効でないすべての領域で各チャネルに 0 の値を持たせることができます。たとえば、データやオフだが記憶に残る値 (誕生日など、0.17122012 (今日の日付) の行に沿った値を持つ) を使用して、プログラムで簡単にそれらを無視したり、チャネル処理コードにチャネルに基づいて特定のディメンションのみを読み取らせたりすることができます。 GPU を使用してデータを処理することで速度が向上し、データが相殺され、高速なシステムがそのまま残ります。

それがもう少し役立つことを願っています。

于 2012-12-17T13:16:33.500 に答える