2009-07-03 10 views
12

Je commence à travailler sur ma première application iPhone OpenGL, mais je suis tombé sur un petit problème. J'ai une petite texture TRES SIMPLE que je veux utiliser comme sprite dans un jeu en 2D, mais avec des pixels bizarres "aléatoirement" colorés en haut.OpenGL Les textures ES de PNG avec transparence sont rendues avec des artefacts étranges et me rendent fou!

http://i40.tinypic.com/2s7c9ro.png < - Screenshot ici

je reçois quelque sorte le sentiment que c'est la faute de Photoshop, donc si quelqu'un quelque chose qui s'il vous plaît laissez-moi savoir.

Si elle est photoshop pas alors il doit y avoir mon code ... Voici donc le code en question ...

- (void)loadTexture { 

CGImageRef textureImage = [UIImage imageNamed:@"zombie0.png"].CGImage; 

if (textureImage == nil) { 
    NSLog(@"Failed to load texture image"); 
    return; 
} 

NSInteger texWidth = CGImageGetWidth(textureImage); 
NSInteger texHeight = CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast); 

CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage); 

CGContextRelease(textureContext); 

glGenTextures(1, &textures[0]); 

glBindTexture(GL_TEXTURE_2D, textures[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

glEnable(GL_TEXTURE_2D); 

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

}

Cette fonction de mélange a donné les meilleurs résultats.

S'il vous plaît, laissez-moi savoir ce que vous pensez est faux.

Merci beaucoup, ce problème m'a rendu fou.

Répondre

19

Un problème que je peux voir dans le code est que vous n'effacez pas votre contexte avant de dessiner l'image. Comme votre image contient des zones transparentes et est composée en arrière-plan, vous ne voyez que ce qui est dans la mémoire allouée par malloc. Essayez-vous de réglage du mode Quartz Blend pour copier avant de dessiner l'image:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy); 

Vous pouvez également utiliser calloc au lieu de malloc, puisque calloc vous donne mis à zéro la mémoire.

Votre mélange OpenGL est correcte:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

vous donne "OVER" Porter-Duff, qui est ce que vous voulez habituellement.

+0

VOUS ÊTES GÉNIAL! Cette réponse me rend totalement heureux et a du sens pour moi! J'ai eu l'impression que ces objets étaient une sorte de mémoire, mais je n'y avais pas réfléchi. Merci encore beaucoup sooooooo! Vous réglez! –

+0

* devenant rouge * ... content de pouvoir aider. –

+0

MERCI aussi! Je ne pouvais pas comprendre pourquoi j'avais tous ces artefacts, maintenant ça a l'air génial. – mk12

1

Essayez d'effacer votre CGContextRef premier:

CGContextSetRGBFillColor(ctxt, 1, 1, 1, 0); 
CGContextFillRect(ctxt, CGRectMake(0, 0, w, h)); 
0

Très probablement votre image a des pixels colorés avec une valeur alpha zéro, mais en raison de la fonction de mélange que vous les montrer. Essayez

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

Cette fonction de fusion donne de bons résultats uniquement pour l'alpha non prémultiplié, rarement en Quartz. –