2010-11-21 13 views
5

GlReadPixels kullanarak alfa piksel değerlerini okumaya çalışıyorum. Yaptığım ilk şey, pikselleri ayrı ayrı okudu. İşleri hızlandırmak için denemek için ben bir kerede tüm pikselleri okuma çalıştı:glReadPixels ve GL_ALPHA

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

ve işe yaradı, ama gerçekten yavaş.

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

Ama olsun: Şimdi RGB bileşenlerine yer israf etmeden, sadece alfa değerini almak çalışıyorum OpenGL error 0x0500 in -[EAGLView swapBuffers].

INVALID_ENUM (0x0500) neden atılır?

cevap

6

documentation on glReadPixels() for OpenGL ES'a göre, biçim parametresi için geçerli enum değerleri GL_RGBA ve GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES'dur. IPhone için bir biçim olarak GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES'un ne anlama geldiğini kontrol etmeniz ve görmeniz gerekecek, ancak GL_ALPHA için destek sağlayamayabilir.

Her halükarda, bu rotaya gitmenin okurlarınızı önemli ölçüde hızlandıracağından kuşku duyuyorum çünkü yapacağınız tek şey RGB bileşenlerini atmaktır. GlReadPixels() ile performans sorunlarınız muhtemelen başka bir yerde yatar. Bunun nedenleri hakkında iyi bir tartışma, tartışma ipinde here bulunabilir.

Bir doku tarafından desteklenen bir ekran koruyucusunu işlemek, daha sonra bu doku kullanılarak GPU'da daha fazla işlem yapmak mümkün mü? Bu, glReadPixels()'u kullanmaktan daha iyi bir performans getireceği anlamına geliyor.

+0

Bunun için teşekkürler. Son önerinizle ilgili olarak, bunu nasıl uygulayacağınız konusunda bir işaretçiniz var mı? – sharvey

+0

@sharvey - Yazılıma buradan bakın: http://www.sunsetlakesoftware.com/2010/10/22/gpu-accelerated-video-processing-mac-and-ios. Orada var örnek uygulama: http://www.sunsetlakesoftware.com/sites/default/files/ColorTracking.zip bir dokuya render yapmak için bir offscreen framebuffer kullanır, ben 'glReadPixels() 'kullanarak sonucu çekiyorum, çünkü ben istediğim GPU tabanlı rengi bitiremedi. Bunu yapmak için daha yavaş bir C rutini kullanarak bitti. Bunu bir noktada tamamlayacağım. –

İlgili konular