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:
utilisant le code pour charger les textures et après les liant et le dessin, c'est ce qui se passe:
Assurément, ce n'est pas la transparence fonctionne comme i ntended. Si quelqu'un pouvait aider, ce serait génial.
Merci
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. –
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 ... –