2010-11-21 2 views
5

私はglReadPixelsを使ってアルファピクセル値を読み取ろうとしています。私が最初にしたことは、ピクセルを個別に読み取ることでした。物事をスピードアップしようとすると、すべてのピクセルを一度に読み取ろうとしました。glReadPixelsとGL_ALPHA

GLubyte *pixels = new GLubyte[w*h*4]; 
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

それはうまくいったが、実際は遅いです。今私は、RGBコンポーネントにスペースを無駄にすることなく、単にアルファ値を取得しようとしている:

GLubyte *pixels = new GLubyte[w*h]; 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glPixelStorei(GL_PACK_ALIGNMENT, 1); 
glReadPixels(0, 0, w, h, GL_ALPHA, GL_UNSIGNED_BYTE, pixels); 

しかし、私は得る:OpenGL error 0x0500 in -[EAGLView swapBuffers]

INVALID_ENUM (0x0500)がスローされた理由は何ですか?

答えて

6

documentation on glReadPixels() for OpenGL ESによれば、フォーマットパラメータの有効な列挙値はGL_RGBAGL_IMPLEMENTATION_COLOR_READ_FORMAT_OESです。あなたは、GL_IMPLEMENTATION_COLOR_READ_FORMAT_OESがiPhoneのフォーマットとして何を意味するかを確認してみる必要がありますが、GL_ALPHAのサポートを提供していない可能性があります。

いずれにしても、そのルートを使用すると読み取りが大幅に高速化されることは間違いありません。これは、RGBコンポーネントを破棄することだけで済みます。 glReadPixels()のパフォーマンスの問題はおそらく他の場所にあります。この理由の良い議論は、ディスカッションスレッドhereにあります。

テクスチャに裏打ちされたオフスクリーンフレームバッファにレンダリングし、そのテクスチャを使用してGPUでさらに処理することは可能でしょうか?これは、glReadPixels()を使用するよりも優れたパフォーマンスが得られるように思えます。

+0

ありがとうございます。あなたの最後の提案については、それを実装する方法に関する指針がありますか? – sharvey

+0

@sharvey - こちらの記事を参照してください:http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios私がそこに持っているサンプルアプリケーション:http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zipは、オフスクリーンのフレームバッファを使ってテクスチャにレンダリングしますが、私は 'glReadPixels()'を使って結果を取り込みます。私が望むGPUベースのカラー平均化を完了できませんでした。私はこれを行うために、より遅いCルーチンを使用して終了しました。私はある時点でこれを完成させます。 –

関連する問題