2009-08-17 9 views
2

J'écris un jeu 2d dans Iphone, qui utilise des textures comme sprites, j'obtiens du bruit de couleur autour de certaines des images que je rend (mais ce bruit n'apparaît jamais au-dessus du texture elle-même, seulement dans la partie transparente autour d'elle). Le problème n'arrive pas avec le reste de mes textures. Voici le code que j'utilise pour charger des textures:Couleurs bizarres lors du chargement de textures avec openGL pour iphone

- (void)loadTexture:(NSString*)nombre { 

CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage; 
if (textureImage == nil) { 
NSLog(@"Failed to load texture image"); 
return; 
} 

textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage)); 
textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage)); 

imageSizeX= CGImageGetWidth(textureImage); 
imageSizeY= CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(textureWidth * textureHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage); 

CGContextRelease(textureContext); 

glGenTextures(1, &textures[0]); 

glBindTexture(GL_TEXTURE_2D, textures[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

glEnable(GL_BLEND); 

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

} 
+0

Pouvez-vous fournir une capture d'écran? –

Répondre

4

Votre mémoire n'est pas remis à zéro avant de tirer l'image en elle. Les pixels amusants que vous voyez sont des données anciennes dans les régions transparentes de votre image. Utilisez calloc au lieu de malloc (calloc renvoie la mémoire remise à zéro).

Vous pouvez également utiliser CGContextSetBlendMode(textureContext, kCGBlendModeCopy); avant de dessiner l'image.

Si vous voulez connaître toute l'histoire:

Ce problème existe uniquement pour de petites images en raison du fait que malloc a différents chemins de code pour les petites tailles d'allocation. Il renvoie un petit bloc d'un pool qu'il gère dans l'espace utilisateur. Si la taille demandée est supérieure à un certain seuil (16K, je crois), malloc récupère la mémoire du noyau. Les nouvelles pages sont bien sur mises à zéro.

Il m'a fallu du temps pour comprendre cela.

+0

Problème résolu, merci pour votre aide. –

Questions connexes