OpenGL ES Texturen von PNG-Dateien mit Transparenz werden mit seltsamen Artefakte gemacht und mich verrückt!

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

Frage

Ich fange an, an meinem ersten OpenGL iPhone App zu arbeiten, aber ich habe einen frühen snag getroffen.

Ich habe eine sehr einfache kleine Textur, die ich als ein Sprite in einem 2D-Spiel verwenden möchten, aber es macht mit seltsamen ‚zufällig‘ farbigen Pixel bis oben.

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

ich irgendwie das Gefühl, dass dieser Fehler in Photoshop ist, also wenn jemand etwas darüber lasst es mich wissen.

Wenn es nicht Photoshop, dann ist es gotta mein Code sein ... So, hier ist der Code in Frage ...

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

}

Diese Mischung Funktion die besten Ergebnisse erzielt.

Bitte, lassen Sie mich wissen, was Sie denken, ist falsch.

Vielen Dank, dieses Problem mir verrückt wurde die Fahrt.

War es hilfreich?

Lösung

Ein Problem, das ich aus dem Code sehen kann, ist, dass Sie nicht Ihren Kontext löschen bevor das Bild zeichnen. Da Ihr Bild transparenten Bereich enthält und auf dem Hintergrund zusammengesetzt ist, sehen Sie genau das, was von malloc im Speicher ist. Versuchen Sie, Sie Quarz-Mischmodus zu kopieren, bevor das Bild zeichnen:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

Sie können auch calloc anstelle von malloc, da calloc gibt Ihnen Speicher auf Null gesetzt.

Ihre OpenGL Blending ist korrekt:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

gibt Ihnen Porter-Duff "OVER", das ist, was Sie in der Regel wollen.

Andere Tipps

Versuchen Sie das Löschen Ihrer CGContextRef zuerst:

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

Die meisten wahrscheinlich Ihr Bild hat einige farbige Pixel mit einem Null-Alpha-Wert, sondern auch wegen der Mischfunktion Sie sie zeigen. Versuchen

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top