iPhone OpenGLES纹理加载问题与透明度

时间:2010-09-02 12:54:43

标签: iphone objective-c opengl-es textures transparent

我一直在使用这种方法(我想我是从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]]; 

现在这对我很有用,但是当加载的图像包含透明区域时,它们会显示其后面的图像。

例如,如果所有五个图像都有透明区域:

  • 1.png将显示它应该显示。
  • 2.png将在后台显示1.png。
  • 3.png将在背景中显示2.png,背景为1.png。
  • 等...

我认为这将在我的绘图代码中,但即使我禁用GL_BLEND,这仍然会发生。我使用GL_TRIANGLE_FAN使用顶点数组绘图。

编辑:进一步解释

以下是我在游戏中使用的3种纹理:

alt text

使用代码加载纹理并在绑定它们和绘图之后,会发生以下情况:

alt text

当然,这不是透明的功能。如果有人能提供帮助那就太棒了。

由于

1 个答案:

答案 0 :(得分:1)

我有同样的问题。在将纹理绘制到CGContextRef之前,需要清除CGContextRef。它碰巧保留了最后一张图像,它也可能是未初始化的内存或其他东西。

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

CGContextDrawImage

之前调用此权限