2009-09-09 129 views
0

我有一个简单的16x16粒子,从不透明变为透明。不幸的是,在我的iPhone端口显示不同,我看不到代码中的差异。大部分代码基本相同。OpenGL ES/iPhone的透明度/混合问题

我上传的图像here显示问题

左边的粒子是不正确的渲染iPhone版本,右边是它如何出现在Mac和Windows。这只是一个简单的RGBA .png文件。

我试过无数的混合函数和glTexEnv设置,但我似乎无法使它们相同。

只是要彻底,在iPhone上我的纹理加载代码看起来像我用的是glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)以下


GLuint TextureLoader::LoadTexture(const char *path) 
{ 
    NSString *macPath = [NSString stringWithCString:path length:strlen(path)]; 
    GLuint texture = 0; 

    CGImageRef textureImage = [UIImage imageNamed:macPath].CGImage; 
    if (textureImage == nil) 
    { 
     NSLog(@"Failed to load texture image"); 
     return 0; 
    } 

    NSInteger texWidth = CGImageGetWidth(textureImage); 
     NSInteger texHeight = CGImageGetHeight(textureImage); 

    GLubyte *textureData = new GLubyte[texWidth * texHeight * 4]; 
    memset(textureData, 0, texWidth * texHeight * 4); 

    CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast); 
    CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage); 

    CGContextRelease(textureContext); 

    //Make a texture ID, bind it, create it 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

    delete[] textureData; 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    return texture; 
} 

的混合功能;

我会尝试任何想法的人扔我,因为这对我来说有点神秘。

干杯。

+0

模拟器渲染左侧的图像还是实际的硬件? – 2009-10-01 08:17:08

回答

0

这看起来像标准的“纹理转换为预乘alpha”问题。

可以使用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

,或者您可以编写自定义加载代码,以避免预乘。

+0

我试过glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA),虽然它似乎工作正常,只有一个粒子,只要有很多重叠的,颜色变得相当强烈/明亮。 虽然我会研究这个“预乘alpha”的东西。 – user156848 2009-09-09 21:50:16

0

打电话给我很幼稚,但看到预乘图像需要(a r,a g,a * b,a),我想我只是将rgb值除以a。

当然,只要alpha值大于r,g,b分量,粒子纹理就变黑了。好吧。除非我可以找到一个不同的图像加载器,否则我只会制作所有rgb组件0xff(白色)。这对我来说是一个很好的临时解决方案,因为我需要一个白色颗粒或者只是在应用程序中对其进行调色。稍后,我可能会制作原始的rgba文件并将其读入,因为这主要是针对非常小的16x16和更小的粒子纹理。

我不能使用Premultiplied纹理的粒子系统,因为重叠多个粒子纹理饱和颜色的方式太多。