FBO で glReadPixels を呼び出すと、断続的にクラッシュします。現在、ライブ アプリで 1 日あたり 1000 件以上のクラッシュが発生しています。
ピクセルを読み取って FBO を生成するためのコードを以下に含めます。必要に応じて、使用される他のコードを含めることができます。
typedef struct
{
GLuint frameBufferID;
GLuint textureID;
int textureNum;
} FBO;
+ (void) readPixelsFromFBO: (FBO) fbo withWidth: (int) width andHeight: (int) height intoData: (NSMutableData*) data
{
glActiveTexture( GL_TEXTURE0 + fbo.textureNum );
glBindTexture( GL_TEXTURE_2D, fbo.textureID );
glBindFramebuffer( GL_FRAMEBUFFER, fbo.frameBufferID );
glReadPixels( 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data.mutableBytes );
GLenum error = glGetError();
if ( error != 0 )
NSLog( @"readPixelsFromFBO ERROR: %d", error );
}
+ (FBO) createFBOWithWidth: (int) width andHeight: (int) height andTextureNum: (int) textureNum
{
FBO fbo;
fbo.textureNum = textureNum;
// Generate the IDs
glGenFramebuffers( 1, &fbo.frameBufferID );
glGenTextures( 1, &fbo.textureID );
// Create the texture
glActiveTexture( GL_TEXTURE0 + textureNum );
glBindTexture( GL_TEXTURE_2D, fbo.textureID );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
GLubyte* bytes = (GLubyte*) calloc( width * height * 4, sizeof( GLubyte ) );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bytes );
free( bytes );
// Create the frame buffer
glBindFramebuffer( GL_FRAMEBUFFER, fbo.frameBufferID );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo.frameBufferID, 0 );
// FBO status check
GLenum status = glCheckFramebufferStatus( GL_FRAMEBUFFER );
switch(status)
{
case GL_FRAMEBUFFER_COMPLETE:
NSLog(@"FBO created");
break;
case GL_FRAMEBUFFER_UNSUPPORTED:
NSLog(@"FBO unsupported");
break;
default:
/* programming error; will fail on all hardware */
NSLog( @"Framebuffer Error: make sure that the context was created!" );
break;
}
return fbo;
}
クラッシュ ログは次のようになります (多少の違いがあります)。
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x1
Crashed Thread: 0
Thread 0 Crashed:
0 libGPUSupportMercury.dylib 0x36d0ae22 <redacted> + 10
1 IMGSGX543GLDriver 0x324bff31 <redacted> + 245
2 IMGSGX543GLDriver 0x324c0011 <redacted> + 37
3 IMGSGX543GLDriver 0x324c3a81 <redacted> + 405
4 GLEngine 0x348712f9 <redacted> + 1257
5 OpenGLES 0x34915da3 _glReadPixels + 55