我正在使用GLKit制作一个使用OpenGL ES 2.0的iPhone应用程序。我正在使用GLKTextureLoader来加载纹理。当我的纹理位于mainBundle内部时 - 一切都很精细。我用命令[[NSBundle mainBundle] pathForResource:@"brushRose.png" ofType:nil]
得到它的名字,纹理有以下路径:
/var/mobile/Containers/Bundle/Application/D79492CB-D03C-464D-B06E-00D0DE4389DF/Texture Test.app/brushRose.png
当我尝试从Internet下载完全相同的纹理并将其存储在Application的Documents
文件夹中时。路径如下:
/var/mobile/Containers/Data/Application/CD3FBAAB-B8AE-47F5-9C6E-51C854FC1620/Documents/brushes/ps_roses.png
我得到可怕的结果,可以在下面的图片中看到: First row - texture from mainBundle, second row - from Documents
欢迎任何有关如何解决第二种情况的想法。
可以找到测试项目here
答案 0 :(得分:2)
当您构建包含PNG的应用时,Xcode会在其上运行pngcrush
,其中包括pre-multiplies the alpha。
"非主要捆绑"您正在使用的文件没有预先乘以的alpha。这解释了外观上的差异。
您可以选择在网址纹理上运行pngcrush
,或者在项目中停止运行pngcrush,或者在加载非压缩的PNG时有条件地应用GLKTextureLoaderApplyPremultiplication
:
NSMutableDictionary *options = [@{ GLKTextureLoaderOriginBottomLeft : @NO} mutableCopy];
if ( /** png is uncrushed **/ ) {
options[GLKTextureLoaderApplyPremultiplication] = @YES;
}
NSError* error;
GLKTextureInfo* texture = [GLKTextureLoader textureWithContentsOfFile:brushPath options:options error:&error];