【问题标题】:glReadPixels and GL_ALPHAglReadPixels 和 GL_ALPHA
【发布时间】:2010-11-21 00:37:28
【问题描述】:

我正在尝试使用 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) 吗?

【问题讨论】:

    标签: iphone opengl-es cocos2d-iphone


    【解决方案1】:

    根据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() 会产生更好的性能。

    【讨论】:

    • 谢谢你。关于您的最后一个建议,您对如何实施有任何指示吗?
    • @sharvey - 在这里查看我的文章:sunsetlakesoftware.com/2010/10/22/…。我在那里的示例应用程序:sunsetlakesoftware.com/sites/default/files/ColorTracking.zip 使用屏幕外帧缓冲区渲染到纹理,尽管我使用glReadPixels() 提取结果,因为我无法完成我想要的基于 GPU 的颜色平均。我最终使用了一个较慢的 C 例程来执行此操作。我会在某个时候完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多