2010-07-28 3 views
3

J'ai un problème avec OpenGL ES sur iPhone.Comment obtenir une image transparente du contexte OpenGL ES sur iPhone

Je travaille sur un projet, il dessine quelque chose sur la vue, puis enregistre l'image. Il a aussi une image de fond. J'ai combiné l'image obtenir de la vue et l'image de fond.

J'ai défini la propriété opaque de la vue sur NO, mais l'image est toujours opaque à partir de la vue. Donc, je ne pouvais pas combiner les deux images ensemble. Je ne pouvais voir que l'image de devant, l'image de fond était introuvable.

CAEAGLLayer *EAGLLayer = (CAEAGLLayer *)self.layer; 
     EAGLLayer.opaque = NO; 

Obtenir l'image code comme ceci:

- (UIImage *)GetImage 
{ 
    CGFloat Width = self.frame.size.width; 
    CGFloat Height = self.frame.size.height; 
    GLubyte *TmpBuffer = (GLubyte *)malloc(Width * Height * 4); 
    glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, TmpBuffer); 
    GLubyte *Buffer = (GLubyte *)malloc(Width * Height * 4); 

    for(int y=0; y<Height; y++) { 
     for(int x=0; x<Width * 4; x++) { 
      Buffer[((NSInteger)Height - 1 - y) * (NSInteger)Width * 4 + x] = TmpBuffer[y * 4 * (NSInteger)Width + x]; 
     } 
    } 
    CGDataProviderRef Provider = CGDataProviderCreateWithData(NULL, Buffer, Width * Height * 4, NULL); 

    int BitsPerComponent = 8; 
    int BitsPerPixel = 32; 
    int BytesPerRow = 4 * 480; 
    CGColorSpaceRef ColorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo BitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent RenderingIntent = kCGRenderingIntentDefault; 

    // Make the cgimage. 
    CGImageRef ImageRef = CGImageCreate(480, 320, 
             BitsPerComponent, 
             BitsPerPixel, 
             BytesPerRow, 
             ColorSpaceRef, 
             BitmapInfo, 
             Provider, 
             NULL, NO, 
             RenderingIntent); 

    return [UIImage imageWithCGImage:ImageRef]; 
} 

Combine code comme ceci:

- (void)Combine:(UIImage *)Back 
{ 
    UIGraphicsBeginImageContext(self.frame.size); 

    CGContextRef aContext = UIGraphicsGetCurrentContext(); 

    CGContextSaveGState(aContext); 

    CGContextScaleCTM(aContext, 1.0, -1.0); 
    CGContextTranslateCTM(aContext, 0, -self.frame.size.height); 

    UIImage *Front = [self GetImage]; 

    CGContextDrawImage(aContext, 
         CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), 
         Back.CGImage); 

    CGContextDrawImage(aContext, 
         CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), 
         Front.CGImage); 

    CGContextRestoreGState(aContext); 

    UIImageWriteToSavedPhotosAlbum(UIGraphicsGetImageFromCurrentImageContext(), nil, nil, nil); 

    UIGraphicsEndImageContext(); 
} 

Que dois-je faire? toute suggestion sera heureux. Merci d'avance.

+0

est-il travaille avec iOS6? – GameLoading

Répondre

1

J'ai fait exactement cela.

J'utilise les propriétés CAEAGLLayer suivantes:

eaglLayer.opaque = NO;  
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; 

et dans votre - (UIImage *) Méthode GetImage utiliser plutôt:

CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast; 

si nécessaire votre Combiner: méthode peut être ajustée pour enregistrer les deux images combinées à un UIImage en utilisant:

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

espérons que cette aide :)

0

Comment créez-vous votre tampon OpenGL? Plus précisément, dans votre EAGLView, quand ou vous définissez la propriété de la classe drawableProperties de votre CAEAGLLayer, il devrait ressembler à:

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; 

Si vous utilisez kEAGLColorFormatRGB565 au lieu de kEAGLColorFormatRGBA8, votre framebuffer ne sera pas stocker une valeur alpha, donc Ce sera toujours opaque.

Si vous ne définissez pas déjà cette propriété, essayez de la définir.

+0

J'ai défini le paramètre kEAGLDrawablePropertyRetainedBacking de drawableProperties sur "YES", car lorsque je l'ai défini sur "NO", l'écran a scintillé. – Tony

+0

C'est plus ou moins pertinent pour le problème alpha. Il ne devrait probablement pas scintiller, et l'avoir comme OUI peut réellement causer de légers problèmes de performance, mais c'est une question complètement distincte. Nous étions surtout préoccupés par le format de couleur. Est-ce que ça a marché? – Perrako

Questions connexes