OpenGL ES glReadPixels exc_bad_access
Posted
技术标签:
【中文标题】OpenGL ES glReadPixels exc_bad_access【英文标题】: 【发布时间】:2011-11-29 10:09:47 【问题描述】:我正在尝试使用 OpenGL ES 和 ffmpeg 从图像创建视频,但在 iPad(4.3) 上我在 glReadPixels
上崩溃了
-(NSData *) glToUIImage
int numberOfComponents = NUMBER_OF_COMPONENTS; //4
int width = PICTURE_WIDTH;
int height = PICTURE_HEIGHT;
NSInteger myDataLength = width * height * numberOfComponents;
NSMutableData * buffer= [NSMutableData dataWithLength :myDataLength];
[self checkForGLError];
GLenum type = NUMBER_OF_COMPONENTS == 3 ? GL_RGB : GL_RGBA; //RGBA
glReadPixels(0, 0, width, height, type, GL_UNSIGNED_BYTE, [buffer mutableBytes]); //EXC_BAD_ACCESS here
return buffer;
它在 iPhone 4 (4.3) 和 iPod Touch 上运行,但在 iPhone 3G(3.0) 和 iPad(4.3) 上出现问题。你能帮我解决这个问题吗?
在 iPhone 3G(3.0) 和 iPad(4.3) 上我也遇到了视频问题 - 前 5-20 个视频帧有垃圾。也许优化问题?还是建筑?
已编辑 堆栈:
#0 0x33be3964 in void BlockNxN<64ul, 16ul, 1, BLOCK_CONVERTER_NULL_32>(unsigned long, int, int, unsigned long, int, int, unsigned int, unsigned int, unsigned int, unsigned int) ()
#1 0x33be1c76 in glrBIFDetile ()
#2 0x33b586b2 in sgxGetImage(SGXImageReadParams const*) ()
#3 0x33b50d38 in gldReadPixels ()
#4 0x31813e16 in glReadPixels_Exec ()
#5 0x31e3c518 in glReadPixels ()
【问题讨论】:
【参考方案1】:我知道了!!!
我已经解决了这个问题大约两周。
你必须在[(EAGLView *)eagleView presentFramebuffer];
之前调用glReadPixels()
因此您必须在读取像素之前绑定 colorRenderbuffer。 最终方法列表:
int numberOfComponents = NUMBER_OF_COMPONENTS;
int width = PICTURE_WIDTH;
int height = PICTURE_HEIGHT;
NSInteger myDataLength = width * height * numberOfComponents;
NSMutableData * buffer= [NSMutableData dataWithLength :myDataLength];
glBindRenderbuffer(GL_RENDERBUFFER_OES, [((EAGLView *)eagleView) colorRenderbuffer]);
[self checkForGLError];
glPixelStorei(GL_PACK_ALIGNMENT, 4); // force 4 byte alignment
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, [buffer mutableBytes]);
return buffer;
【讨论】:
花了 8 多小时与崩溃作斗争:/ 非常感谢。以上是关于OpenGL ES glReadPixels exc_bad_access的主要内容,如果未能解决你的问题,请参考以下文章
来自 OpenGL ES 帧缓冲区 (iOS) 的 CGImageRef