我正在尝试使用 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);
但是我得到:-[EAGLView swapBuffers] 中的 OpenGL 错误 0x0500
。
知道为什么会抛出 INVALID_ENUM (0x0500)
吗?
最佳答案
根据documentation on glReadPixels() for OpenGL ES ,格式参数的唯一有效枚举值是 GL_RGBA
和 GL_IMPLMENTATION_COLOR_READ_FORMAT_OES
。您需要检查并了解 GL_IMPLMENTATION_COLOR_READ_FORMAT_OES
作为 iPhone 格式的含义,但它可能不提供对 GL_ALPHA
的支持。
无论如何,我怀疑走这条路会显着加快你的读取速度,因为这样做只会丢弃 RGB 分量。 glReadPixels() 的性能问题可能出在其他地方。关于其原因的很好的讨论可以在讨论线程 here 中找到。 .
您是否可以渲染到由纹理支持的离屏帧缓冲区,然后使用该纹理在 GPU 上进行进一步处理?这听起来比使用 glReadPixels()
会产生更好的性能。
关于iphone - glReadPixels 和 GL_ALPHA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235812/