2012-01-12 1 views
0

Je prends une photo à l'aide de l'appareil photo et je veux en changer le format pour le rendre compatible avec la texture OpenGL ES 2.0.Comment changer le format d'une image dans ios pour l'utiliser dans OpenGL? (Charger des images dans OpenGL ES 2.0)

D'abord j'obtenir l'image et je redimensionner (ce qui en fait une puissance de 2 juste au cas où):

UIImage *newImage = [self imageWithImage:imgName scaledToSize:CGSizeMake(100, 144)]; 

Puis-je changer le format de jpeg (qui je pense que son format par défaut de l'iPhone) à .png:

NSData *test = UIImagePNGRepresentation(newImage); 

UIImage *converted = [[UIImage alloc] initWithData:test]; 

dernier, je crée mon contexte et d'en tirer dedans:

GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte)); 

CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, 
                 CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);  



CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage); 

CGContextRelease(spriteContext); 

et je peux ajouter le tampon GL ouvert après cela, malheureusement, il ne fonctionne pas (seul le noir apparaît), je suis assez sûr de son format d'image parce que si je fais exactement la même procédure avec une autre image que je sais déjà, tout se passe bien. J'ai fait quelques recherches et cela a peut-être quelque chose à voir avec la profondeur de couleur de mon image, car j'ai besoin de 4 bits par pixel pour le rendu en texture opengl (4,4,4,4).

Format interne: RGBA, Format externe: RGBA, Type: UNSIGNED BYTE, Octets par pixel: 4.

Donc ma question est, comment puis-je changer cette .png quelle qu'en soit la profondeur qu'il a le schéma i besoin ? PD: Si quelqu'un connaît une manière différente de charger une image dans opengl s'il vous plaît faites le moi savoir!

Merci!

Répondre

0

ma méthode de configuration de texture. Je pense tout clair, sinon - poser des questions

- (GLuint)setupTexture:(NSString *)fileName { 
    CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage; 
    if (!spriteImage) { 
     NSLog(@"Failed to load image %@", fileName); 
     exit(1); 
    } 

    size_t width = CGImageGetWidth(spriteImage); 
    size_t height = CGImageGetHeight(spriteImage); 

    GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte)); 

    CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);  

    CGContextTranslateCTM (spriteContext, 0, height); 
    CGContextScaleCTM (spriteContext, 1.0, -1.0); 

    CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage); 

    CGContextRelease(spriteContext); 

    GLuint texName; 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glGenTextures(1, &texName); 
    glBindTexture(GL_TEXTURE_2D, texName); 


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 


    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); 

    free(spriteData);   
    return texName; 
} 
+0

Merci pour la réponse rapide. J'ai essayé votre méthode et cela ne fonctionne que pour une texture déjà définie. le problème est que j'essaie de "texturer" un objet en utilisant la caméra sur l'iphone donc je dois prendre l'entrée de la caméra. J'ai une image et je l'affiche sur mon écran en format jpeg et png donc je sais que ça marche, j'ai aussi essayé de le redimensionner. mais quand j'ai essayé de l'afficher en utilisant votre méthode, je reçois exactement le même résultat im obtenir (noir où la texture devrait être) J'ai rencontré quelque chose de similaire quand je voulais créer ma texture et le problème était la profondeur de couleur. Des idées? = ( – Pochi

+0

Il s'est avéré que le problème était dans la taille d'image que je créais Cette ligne UIImage * newImage = [auto imageWithImage: imgName scaledToSize: CGSizeMake (100, 144)]; Crée une puissance NON de 2 images, et pour les textures iphone vous avez besoin d'une puissance de 2 images (256x256, 256x512, etc.) Merci pour votre aide – Pochi

+0

oui! :) Je pense que vous savez à ce sujet. – SAKrisT