我一直在使用这种方法(我想我是从Apple的一个示例代码项目中得到的):
- (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]];
现在这对我很有用,但是当加载的图像包含透明区域时,它们会显示其后面的图像。
例如,如果所有五个图像都有透明区域:
我认为这将在我的绘图代码中,但即使我禁用GL_BLEND,这仍然会发生。我使用GL_TRIANGLE_FAN
使用顶点数组绘图。
编辑:进一步解释
以下是我在游戏中使用的3种纹理:
使用代码加载纹理并在绑定它们和绘图之后,会发生以下情况:
当然,这不是透明的功能。如果有人能提供帮助那就太棒了。
由于
答案 0 :(得分:1)
我有同样的问题。在将纹理绘制到CGContextRef之前,需要清除CGContextRef。它碰巧保留了最后一张图像,它也可能是未初始化的内存或其他东西。
CGContextClearRect( cgContext, CGRectMake( 0.0f, 0.0f, width, height ) );
在CGContextDrawImage
。