2010-11-21 116 views
5

我想使用glReadPixels读取alpha像素值。我做的第一件事是单独读取像素。为了加快速度,我试着一次读取所有像素:glReadPixels和GL_ALPHA

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

它工作,但真的很慢。现在,我想只是获取alpha值,不浪费空间,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 2010-11-22 14:18:59

+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例程来做到这一点。我会在某个时候完成这个。 – 2010-11-22 15:13:01