2010-11-21 19 views
5

Ich versuche, die Alpha-Pixelwerte mit glReadPixels zu lesen. Das erste, was ich gemacht habe, war, die Pixel einzeln zu lesen. Um zu versuchen, die Dinge zu beschleunigen, habe ich versucht, alle Pixel auf einmal zu lesen:glReadPixels und GL_ALPHA

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

und es funktionierte, aber sehr langsam. Jetzt versuche ich, nur den Alpha-Wert abrufen, ohne auf die RGB-Komponenten Platzverschwendung:

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); 

Aber ich bekomme: OpenGL error 0x0500 in -[EAGLView swapBuffers].

Irgendeine Idee, warum ein INVALID_ENUM (0x0500) geworfen wird?

Antwort

6

Gemäß der documentation on glReadPixels() for OpenGL ES sind die einzigen gültigen Enum-Werte für den Formatparameter GL_RGBA und GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES. Sie müssen überprüfen und sehen, was GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES bedeutet, als ein Format für das iPhone, aber es kann möglicherweise keine Unterstützung für GL_ALPHA.

In jedem Fall bezweifle ich, dass diese Route dramatisch beschleunigt Ihre Lesevorgänge, weil alles, was die RGB-Komponenten verwerfen wird. Ihre Leistungsprobleme mit glReadPixels() liegen wahrscheinlich woanders. Eine gute Erörterung der Gründe dafür findet sich im Diskussionsthread here.

Wäre es möglich, dass Sie in einen Offscreen-Framebuffer rendern, der mit einer Textur hinterlegt wurde, und dann die GPU mit dieser Textur weiterverarbeiten? Dies klingt nach einer besseren Leistung als die Verwendung von glReadPixels().

+0

Vielen Dank dafür. Haben Sie bezüglich Ihres letzten Vorschlags Hinweise, wie Sie das umsetzen können? – sharvey

+0

@sharvey - Siehe meine write-up hier: http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios. Die Beispielanwendung, die ich dort habe: http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zip verwendet einen Offscreen-Framebuffer, um zu einer Textur zu rendern, obwohl ich das Ergebnis mit 'glReadPixels()' da I einlese Ich konnte die GPU-basierte Farbmittelung, die ich wollte, nicht beenden. Ich benutzte eine langsamere C-Routine, um dies zu tun. Ich werde das irgendwann fertigstellen. –

Verwandte Themen