Domanda

sto cominciando a lavorare sul mio primo OpenGL applicazione per iPhone, ma ho colpito un intoppo iniziale.

Ho un po 'di struttura molto semplice che voglio usare come un folletto in un gioco in 2D, ma rende con strani pixel 'casualmente' colorate sulla parte superiore.

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

I sorta della sensazione che questo è colpa di Photoshop, quindi se qualcuno qualcosa a tale proposito per favore fatemelo sapere.

Se non di Photoshop allora devo essere il mio codice ... Così qui è il codice in questione ...

- (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);

}

Questa funzione miscela ha dato i migliori risultati.

Per favore, fatemi sapere cosa ne pensate è sbagliato.

La ringrazio molto, questo problema mi ha guidandolo nuts.

È stato utile?

Soluzione

Un problema che posso vedere dal codice è che non si cancella vostro contesto prima di disegnare l'immagine. Dal momento che l'immagine contiene aree trasparenti ed è composta sullo sfondo, basta vedere cosa c'è nella memoria allocata da malloc. Provate voi impostare la modalità di miscelatura quarzo per copiare prima di disegnare l'immagine:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

È anche possibile utilizzare calloc invece di malloc, dal momento che calloc dà azzerato la memoria.

Il tuo miscelazione OpenGL è corretta:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

ti dà Porter-Duff "OVER", che è quello che di solito si desidera.

Altri suggerimenti

Prova cancellare la tua CGContextRef prima:

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

Molto probabilmente la vostra immagine ha dei pixel colorati con un valore di alfa pari a zero, ma a causa della funzione di blending si sta mostrando loro. Prova

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top