Я использую этот метод (я думаю, что я получил его от одного из примеров коды проектов компании 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 текстуры я использую в моей игре:
Используя код для загрузки текстур и после их связывания и рисунок, это что происходит:
Конечно, это не прозрачность функционирует как я ntended. Если кто-то может помочь, это будет здорово.
Thanks
Это прозрачность функционирует по назначению - позволяя вам просматривать слои ниже. Я не уверен, что вопрос здесь. –
Я обновил вопрос, чтобы было легче понять. Второе изображение - это то, что происходит, когда я привязываю каждую текстуру. Так что для «Img 3» я бы искал только красный квадрат и «Img 2» - зеленый, чтобы рисовать и т. Д. –