GLKTextureLoader,纹理不在mainBundle中

时间:2016-01-06 20:29:24

标签: ios opengl-es glkit

我正在使用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

1 个答案:

答案 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];