texturas de OpenGL ES PNG con transparencia se representan con artefactos extraños y me está volviendo loco!

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

Pregunta

estoy empezando a trabajar en mi primer iPhone OpenGL aplicación, pero he golpeado un gancho temprano.

Tengo un poco de textura muy simple que quiero usar como un sprite en un juego en 2D, pero que presta con extraños al azar píxeles '' de colores encima de la tapa.

http://i40.tinypic.com/2s7c9ro.png <- Captura de pantalla aquí

En cierto modo me da la sensación de que esto es culpa de Photoshop, así que si alguien algo al respecto por favor hágamelo saber.

Si no es photoshop entonces tiene que ser mi código ... Así que aquí está el código en cuestión ...

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

}

Esta función mezcla produjo los mejores resultados.

Por favor, hágamelo saber lo que piensa que está mal.

Muchas gracias, este problema me ha estado volviendo loco.

¿Fue útil?

Solución

Uno de los problemas que puedo ver desde el código es que no desactiva su contexto antes de dibujar la imagen. Debido a que su imagen contiene áreas transparentes y se compone en el fondo, que acaba de ver lo que hay en la memoria asignada por malloc. Trate de que la configuración Modo de mezcla de cuarzo para copiar antes de dibujar la imagen:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

También es posible usar calloc en lugar de malloc, ya que le da calloc puesto a cero la memoria.

Su mezcla OpenGL es correcta:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

le da Porter-Duff "OVER", que es lo que normalmente se desea.

Otros consejos

Trate de borrar su primera CGContextRef:

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

Lo más probable es que su imagen tiene algunos píxeles de colores con un valor alfa de cero, pero debido a la función de mezcla que están mostrando. Trate

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top