glReadPixels和GL_ALPHA

时间:2010-11-21 00:37:29

标签: iphone opengl-es cocos2d-iphone

我正在尝试使用glReadPixels读取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)的任何想法?

1 个答案:

答案 0 :(得分: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()会产生更好的性能。