2010-09-02 16 views
2

Je me sers de cette méthode (je pense que je l'ai eu d'un exemple des projets de code d'Apple):texture iPhone OpenGLES problème de chargement avec la transparence

- (void)loadTexture:(NSString *)name intoLocation:(GLuint)location 
{ 
CGImageRef textureImage = [UIImage imageNamed:name].CGImage; 

if(textureImage == nil) 
{ 
    NSLog(@"Failed to load texture!"); 
    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); 

//The Fix: 
//CGContextClearRect(textureContext, CGRectMake(0.0f, 0.0f, texWidth, texHeight)); 

CGContextDrawImage(textureContext, CGRectMake(0, 0, (float)texWidth, (float)texHeight), textureImage); 
CGContextRelease(textureContext); 

glBindTexture(GL_TEXTURE_2D, location); 
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_LINEAR); 
} 

je puis charger dans mes textures comme tant dans le initWithCoder méthode:

glGenTextures(NUM_OF_TEXTURES, &textures[0]); 
[self loadTexture:@"1.png" intoLocation:textures[0]]; 
[self loadTexture:@"2.png" intoLocation:textures[1]]; 
[self loadTexture:@"3.png" intoLocation:textures[2]]; 
[self loadTexture:@"4.png" intoLocation:textures[3]]; 
[self loadTexture:@"5.png" intoLocation:textures[4]]; 

maintenant, cela fonctionne très bien pour moi, mais quand les images chargées contiennent des zones transparentes, ils montreront les images précédentes derrière eux.

Par exemple, si les cinq images ont des zones transparentes sur les:

  • 1.png montrera comme il se doit. 2.png apparaîtra avec 1.png en arrière-plan. 3.png apparaîtra avec 2.png en arrière-plan avec 1.png en arrière-plan.
  • etc ...

Je pensais que ce serait dans mon code de dessin, mais même quand je désactiver GL_BLEND cela se produit encore. Je dessine en utilisant des tableaux de vertex en utilisant GL_TRIANGLE_FAN.

EDIT: D'autres explications

Voici les 3 textures que je utilise dans mon jeu:

alt text

utilisant le code pour charger les textures et après les liant et le dessin, c'est ce qui se passe:

alt text

Assurément, ce n'est pas la transparence fonctionne comme i ntended. Si quelqu'un pouvait aider, ce serait génial.

Merci

+0

C'est la transparence qui fonctionne comme prévu - vous permettant de voir à travers les couches en dessous. Je ne suis pas sûr de la question ici. –

+0

J'ai mis à jour la question pour la rendre plus facile à comprendre. La deuxième image est ce qui se passe quand je lie chaque texture. Donc pour 'Img 3' je ne chercherais que le carré rouge à dessiner et pour 'Img 2' - le vert à dessiner, etc ... –

Répondre

1

J'ai eu le même problème. Vous devez effacer CGContextRef avant de dessiner la texture. Il arrive juste de tenir la dernière image, il pourrait tout aussi bien être mémoire non initialisée ou quelque chose.

CGContextClearRect(cgContext, CGRectMake(0.0f, 0.0f, width, height)); 

Appelez cela juste avant votre CGContextDrawImage.

+0

Merci! Je ne sais pas pourquoi cela n'a pas été inclus dans l'exemple que j'ai utilisé. Résolu mon problème de toute façon :) –