OpenGL ES(IPhone)alpha混合看起来很奇怪

Dam*_*ian 6 iphone alphablending opengl-es

我正在为Opengl ES中的iPhone编写游戏,我遇到了alpha混合的问题:

我正在使用glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA)alpha混合并尝试用几个"层"组成一个场景,所以我可以单独移动它们而不是静态图像.我在photoshop中创建了一个预览,然后尝试在iphone中获得相同的结果,但是当我将纹理与半透明区域混合时会显示黑色光环.

我附上了一张图片.左边是iphone的屏幕截图,右边是我在photoshop中制作作品时的样子.图像由渐变和带有羽化边缘的沙子图像组成.

这是预期的行为吗?有什么办法可以避开黑暗的边界吗?

谢谢.

编辑:我正在上传包含沙子的png部分.完整的png是512x512,也有其他图像.

我正在使用以下代码加载图像:

NSString *path = [NSString stringWithUTF8String:filePath];
NSData *texData = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [[UIImage alloc] initWithData:texData];
if (image == nil) NSLog(@"ERROR LOADING TEXTURE IMAGE");

GLuint width = CGImageGetWidth(image.CGImage);
GLuint height = CGImageGetHeight(image.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *imageData = malloc( height * width * 4 );
CGContextRef context = CGBitmapContextCreate( imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
CGColorSpaceRelease( colorSpace );
CGContextClearRect( context, CGRectMake( 0, 0, width, height ) );
CGContextTranslateCTM( context, 0, height - height );
CGContextDrawImage( context, CGRectMake( 0, 0, width, height ), image.CGImage );

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);

CGContextRelease(context);

free(imageData);
[image release];
[texData release];
Run Code Online (Sandbox Code Playgroud)

替代文字 替代文字

Dam*_*ian 6

我需要回答我自己的问题:

我无法使用ImageIO框架使其工作,所以我将libpng源添加到我的项目并使用它加载图像.它现在工作得很完美,但我有没有解决以下问题:

图像被加载并在模拟器中显示正常但在真实设备上根本没有加载.我在网上发现,PNG图像格式文件中的像素排序从RGBA转换为BGRA,颜色值也通过压缩实用程序'pngcrush'预先乘以alpha通道值. (出于设备特定的效率原因,使用UIKit接口进行编程时).

该实用程序还重命名文件的标题,使新的PNG文件不能被libpng使用.将PNG文件部署到iPhone上时,这些更改会自动完成.虽然这对UIKit来说很好,但libpng(和其他非Apple库)通常无法读取文件.

简单的解决方案是:

  1. 使用不同的扩展名重命名您的PNG文件.
  2. 为您的iPhone -device- build添加以下用户定义的设置:

    IPHONE_OPTIMIZE_OPTIONS | -skip-PNGs

我做了第二次,它现在在模拟器和设备上工作得很好.