2010-09-02 4 views
2

Я использую этот метод (я думаю, что я получил его от одного из примеров коды проектов компании Apple):iPhone OpenGLES текстуры загрузка проблема с прозрачностью

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

я затем загрузить в моих текстурах как и в initWithCoder метод:

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]]; 

Теперь это отлично работает для меня, но когда загруженные изображения содержат прозрачные области, они будут показывать предыдущие изображения позади них.

Например, если все пять изображений имеют прозрачные участки на них:

  • 1.png покажет, как это должно быть.
  • 2.png покажет с 1.png в фоновом режиме.
  • 3.png будет отображаться с 2.png в фоновом режиме с 1.png в фоновом режиме.
  • и т.д ...

Я думал, что это было бы в моем чертежной коде, но даже когда я отключить GL_BLEND это все еще происходит. Я рисую с использованием вершинных массивов, используя GL_TRIANGLE_FAN.

EDIT: Дальнейшее объяснение

Вот 3 текстуры я использую в моей игре:

alt text

Используя код для загрузки текстур и после их связывания и рисунок, это что происходит:

alt text

Конечно, это не прозрачность функционирует как я ntended. Если кто-то может помочь, это будет здорово.

Thanks

+0

Это прозрачность функционирует по назначению - позволяя вам просматривать слои ниже. Я не уверен, что вопрос здесь. –

+0

Я обновил вопрос, чтобы было легче понять. Второе изображение - это то, что происходит, когда я привязываю каждую текстуру. Так что для «Img 3» я бы искал только красный квадрат и «Img 2» - зеленый, чтобы рисовать и т. Д. –

ответ

1

У меня была эта проблема. Вы должны очистить CGContextRef, прежде чем рисовать текстуру. Просто происходит последнее изображение, это может быть неинициализированная память или что-то в этом роде.

CGContextClearRect(cgContext, CGRectMake(0.0f, 0.0f, width, height)); 

Звоните прямо перед вашим CGContextDrawImage.

+0

Спасибо! Не знаю, почему это не было включено в пример, который я использовал. В любом случае, решила мою проблему :) –