代码之家  ›  专栏  ›  技术社区  ›  ingh.am

iPhone OpenGLES透明度纹理加载问题

  •  2
  • ingh.am  · 技术社区  · 14 年前

    我一直在使用这个方法(我想我是从苹果的一个示例代码项目中得到的):

    - (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\u混合这仍然发生。我使用顶点数组绘制 GL_TRIANGLE_FAN .

    编辑:进一步解释

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

    alt text

    alt text

    当然,这并不是预期的透明。如果有人能帮忙那就太好了。

    谢谢

    1 回复  |  直到 14 年前
        1
  •  2
  •   joeld    14 年前

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

    在你来之前打这个电话 CGContextDrawImage