6

I want to draw a 2D array of pixel data (RGB / grayscale values) on the screen as fast as possible, using OpenGL. The pixel data changes frequently.

I had hoped that I would find a simple function that would let me push in a pointer to an array representing the pixel data, since this is probably the fastest approach. Unfortunately, I have found no such function.

What is the best way to accomplish this task?

4

4 に答える 4

10

おそらくglDrawPixelsはあなたが探している機能ですか?ただし、データが静的な場合は、それを使用してテクスチャを作成し、それを各フレームに描画する方がよいでしょう。

于 2012-05-30T22:16:27.690 に答える
7

ビデオを画面にレンダリングしようとしている(つまり、ピクセルデータをVRAMに繰り返しアップロードしている)ため、最近同様の問題が発生しました。私のアプローチは次のとおりです。

  • glTexImage2D と glTexSubImage2D を使用してデータをテクスチャにアップロードします (つまり、テクスチャ (および該当する場合はテクスチャ ユニット) をバインドしてから呼び出します)。

  • 私の場合、ビデオ フレーム レート (通常は約 24 fps) がアプリケーションのフレーム レート (60 fps を目標) よりも低いため、同じデータを再度アップロードすることを避けるために、フレーム バッファ オブジェクトを使用します (glGenFramebuffers/glBindFramebuffer/ を確認してください)。 glDeleteFramebuffers) を作成し、テクスチャをフレーム バッファー (glFramebufferTexture2D) にリンクします。次に、そのテクスチャを 1 回アップロードし、同じフレームを複数回描画します (glBindTexture による通常のテクスチャ アクセスのみ)。

  • どのプラットフォームを使用しているかはわかりませんが、Mac をターゲットにしているため、Apple 拡張機能を使用して、VRAM へのデータ転送が DMA 経由で確実に行われるようにします (つまり、glTexSubImage2D をすぐに返して、CPU に他の作業を行わせるようにします)。 Mac も使用している場合は、お気軽にお問い合わせください。

  • また、グレースケールのみを使用しているため、アップロードを高速化するために、RGB ベースの形式ではなく GL_LUMINANCE テクスチャ (つまり、1 ピクセルあたり 1 バイト) を使用することを検討することをお勧めします (ただし、テクスチャ データのサイズによって異なります。私はストリーミングしていました)。 HD 1920x1080 ビデオなので、それを抑える必要がありました)

  • また、不必要なデータ変換を避けるために、ハードウェアが使用しているフォーマットにも注意してください (つまり、通常は、RGB だけでなく BGRA データを使用する方がよいようです)。

  • 最後に、私のコードでは、すべての固定パイプライン機能をシェーダーに置き換えました (特に、グレースケールまたは YUV 形式から RGB へのデータの変換)。ただし、これもすべてデータのサイズと CPU または CPU の負荷に依存します。 GPU

これがお役に立てば幸いです。さらに情報が必要な場合は、お気軽に私にメッセージを送ってください

于 2012-05-31T08:57:38.937 に答える
2

最速の方法は、直交投影で画面サイズのクワッドを描画し、ピクセル シェーダーとテクスチャ バッファー オブジェクトを使用して、ピクセル シェーダーのテクスチャに直接描画することだと思います。TBO との間の転送の待ち時間が原因で、ダブル バッファリングが役立つかどうかを確認する必要がある場合があります。

速度があまり問題にならない場合 (かなりインタラクティブなフレームレートが必要な場合)、glDrawPixels は使いやすく、多くの目的で十分に機能します。

于 2012-05-30T22:27:30.897 に答える