textures ES de openGL PNGs avec transparence sont rendus avec des objets étranges et me rend fou!

StackOverflow https://stackoverflow.com/questions/1079884

Question

Je commence à travailler sur ma première application iPhone OpenGL, mais je l'ai frappé un accroc au début.

J'ai un peu de texture très simple que je veux utiliser comme un sprite dans un jeu 2D, mais il rend avec étranges pixels colorés « au hasard » en haut.

http://i40.tinypic.com/2s7c9ro.png <- Capture d'écran 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 ça doit être 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 a été me rend dingue.

Était-ce utile?

La solution

Un problème que je peux voir à partir du code est que vous ne désactivez pas votre contexte avant de tirer l'image. Étant donné que votre image contient des zones transparentes et se compose sur le fond, vous voyez juste 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 la mémoire mis à zéro.

Votre mélange OpenGL est correct:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

Autres conseils

Essayez d'effacer votre CGContextRef premier:

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

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top