6

この質問は OpenGL ES 2.0 (Android 上) に関するものですが、OpenGL ではより一般的かもしれません。

最終的に、すべてのパフォーマンスに関する質問は実装に依存しますが、この質問に一般的に、または経験に基づいて誰かが答えることができれば、役に立ちます。テストコードも書いています。

YUV (12bpp) 画像をテクスチャに読み込み、フラグメント シェーダーで色変換しています。すべて正常に動作しますが、どこでパフォーマンスを改善できるかを確認したいと思います (1 秒あたりのフレーム数)。

現在、私は実際に各画像に 3 つのテクスチャをロードしています。 V コンポーネント (タイプ GL_LUMINANCE で、もちろん Y コンポーネントの 1/4 のサイズ)。

任意の配置で YUV ピクセルを取得できると仮定すると (たとえば、U と V を別々のプレーンに配置するか、散在させる)、3 つのテクスチャを 2 つだけに統合するか、1 つだけに統合する方がよいでしょうか? 明らかに、どのように行っても GPU にプッシュするバイト数は同じですが、テクスチャが少ないとオーバーヘッドが少なくなる可能性があります。少なくとも、使用するテクスチャ ユニットが少なくなります。私のアイデア:

  • U ピクセルと V ピクセルが互いに散在している場合、それらを 2 つのコンポーネントを持つ GL_LUMINANCE_ALPHA タイプの単一のテクスチャにロードできます。
  • YUV イメージ全体を 1 つのテクスチャ (タイプは GL_LUMINANCE ですが、イメージのサイズの 3/2) としてロードし、フラグメント シェーダで、同じテクスチャに対して texture2D() を 3 回呼び出して、算術演算を少し行うことができました。 Y、U、および V コンポーネントの正しいテクスチャ座標を取得するために texture2D に渡す正しい座標を出力します。
4

1 に答える 1