この関数の目的は、openGLイメージからUIImageを返すことです。CG画像に変換される理由は、openGL要素とUIKit要素を重ねてレンダリングできるためです。これは別の関数で処理されます。
奇妙なことに、アプリをシミュレーターで実行すると、すべてが正常に機能します。ただし、複数の異なるiPadでアプリをテストした後、drawGlToImage
メソッドが呼び出されるとself
、アプリはEXC_BAD_ACCESS code=1エラーでクラッシュします。誰かが私がここで何をしているのか知っていますか?以前はスレッドセーフの問題があったことを読みましたUIGraphicsBeginImageContext()
が、iOS4で修正されたようです。
- (UIImage *)drawGlToImage
{
self.context = [EAGLContext currentContext];
[EAGLContext setCurrentContext:self.context];
UIGraphicsBeginImageContext(self.view.frame.size);
unsigned char buffer[1024 * 768 * 4];
NSInteger dataSize = 1024 * 768 * 4;
CGContextRef currentContext = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(currentContext);
glReadPixels(0, 0, 1024, 768, GL_RGBA, GL_UNSIGNED_BYTE, &buffer);
//flip the image
GLubyte *flippedBuffer = (GLubyte *) malloc(dataSize);
for(int y = 0; y <768; y++)
{
for(int x = 0; x <1024 * 4; x++)
{
if(buffer[y* 4 * 1024 + x]==0)
flippedBuffer[(767 - y) * 1024 * 4 + x]=1;
else
flippedBuffer[(767 - y) * 1024 * 4 + x] = buffer[y* 4 * 1024 + x];
}
}
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, flippedBuffer, 1024 * 768 * 4, NULL);
CGImageRef iref = CGImageCreate(1024,768,8,32,1024*4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaLast, ref, NULL, true, kCGRenderingIntentDefault);
CGContextScaleCTM(currentContext, 1.0, -1.0);
CGContextTranslateCTM(currentContext, 0, -self.view.frame.size.height);
UIGraphicsPopContext();
UIImage *image = [[UIImage alloc] initWithCGImage:iref];
UIGraphicsEndImageContext();
return image;
free(flippedBuffer);
UIGraphicsPopContext();
}
ボタンが押されると、呼び出されるメソッドがこの割り当てを行い、アプリがクラッシュします。
UIImage *glImage = [self drawGlToImage];