Это страшная предварительно умноженная альфа-проблема. Я боролся с этим в течение хорошей недели прежде, чем понять это. Указание вашему проекту не сжимать файлы .png не решает проблему, поскольку различные вызовы API повторно умножают альфа. Вот как я это решил.
При настройке режимов наложения и цвета:
blendFuncSource = premultAlpha ? GL_ONE : GL_SRC_ALPHA;
blendFuncDestination = GL_ONE_MINUS_SRC_ALPHA;
if (premultAlpha)
{
glColor4f(colorfilter.red*colorfilter.alpha, colorfilter.green*colorfilter.alpha, colorfilter.blue*colorfilter.alpha, colorfilter.alpha);
}
else
{
glColor4f(colorfilter.red, colorfilter.green, colorfilter.blue, colorfilter.alpha);
}
Вам нужно выяснить, какие изображения используют предварительно умноженную альфа. Вы можете сделать это, проверив заголовки png, когда они загружены:
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo( image );
...
switch( bitmapInfo & kCGBitmapAlphaInfoMask )
{
case kCGImageAlphaPremultipliedFirst:
premultAlpha = YES;
srcFormat = GL_BGRA;
break;
case kCGImageAlphaFirst:
srcFormat = GL_BGRA;
break;
case kCGImageAlphaNoneSkipFirst:
srcFormat = GL_BGRA;
break;
default:
srcFormat = GL_RGBA;
}
Я перефразирую много кода здесь, надеюсь, он все еще полезен.