2011-12-28 8 views
3

私はOpenGL ES 2.0とGLSLシェーダを使用しており、FBOとRenderbuffer(別名オフスクリーンレンダリング)を使用しています。
30 fpsで問題なく動作します。
しかし、glReadPixelsまたはglcopyteximage2dを使用すると、8 fpsになります。
私のようなものでした:
FBReadを使用したglReadPixelsの速度が遅すぎる

glBindFramebuffer(GL_FRAMEBUFFER, frameBuf); 
//DRAW something 
glReadPixels(...); //HERE 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

は私が速度を向上させることができ、とにかくありますか?私はFBOを使用せず、同じパラメータでglReadPixelsを使用すると、15 fpsとなり、FBOを使用すると速度が向上すると思いますか?

+1

'glReadPixels()'などを使って、オフスクリーンレンダリングをスクリーンにコピーしていますか?サーフェスにレンダリングしている場合は、直接(またはOpenGL ESを使用することはできません。 – Bojangles

+0

はい、私はglslシェーダを使用しています。フラグメントシェーダが出力するものは何でも、私は何かを計算できるようにフレームバッファにアクセスして読み込む必要があります。私の目標は、フレームバッファをオフスクリーンで読み込んで何かしてから、最後の画面を描画することです。 – user2168

+1

したがって、2つのテクスチャを作成し、FBOにバインドし、もう1つを入力テクスチャとしてバインドします。次に、FBOを2番目のバウンドに切り替え、1番目をテクスチャとして使用します。コピーしないでください。 (もしESがそれをサポートしていれば、FBOとテクスチャの両方にバインドすることもできますし、読み込むテクスチャを統一して決定し、カラー書き込みを無効にすることもできますPingとPongの間に「何か他のもの」を置くと、通常は "まだ動作しますが"、NV_texture_barrierなどのようにデータが再び読み込まれる前にキャッシュが書き出されるように同期する必要があります。 – Damon

答えて

5

glGet***関数のいずれかを使用してOpenGLデータを取得するのは悪い(非常に悪い)方法です。テクスチャをコピーするには、その一部をスクリーン/その他のテクスチャにコピーするには、クワッドで描画することができます。いくつかの論理処理のためにピクセルデータが必要な場合は、フレームバッファをできるだけ小さくし、必要な場合にのみ読み込みする方がよいでしょう。

関連する問題