【问题标题】:GLKTextureLoader with texture not in mainBundleGLKTextureLoader 纹理不在 mainBundle 中
【发布时间】:2016-01-06 20:29:24
【问题描述】:

我正在使用 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 下载完全相同的纹理并将其存储在应用程序的 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

【问题讨论】:

  • 我尝试了存储库,但两种模式都不起作用。它只绘制彩色方块。
  • @Rhythmic Fistman:我已经从头开始重新下载和重建项目 + 我已经在三种不同的设备上尝试过。它按预期工作。请您提供更多详细信息,为什么您只能看到正方形?你试过调试吗?
  • 嘿,我在模拟器中运行项目。为什么它在那里不起作用?没人知道。这是另一天的问题。
  • 是的,不知何故 GLKit OpenGL 代码在我的模拟器中也不起作用。我从一开始就在设备上开发我的项目。也很高兴为这个问题找到一个解决方案。

标签: ios opengl-es glkit


【解决方案1】:

当您构建包含 PNG 的应用时,Xcode 会在它们上运行 pngcrush,其中包括 pre-multiplies the alpha

您使用的“非主捆绑”文件没有预乘 alpha。这解释了外观上的差异。

您的选择是在您的 url 纹理上运行 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];

【讨论】:

  • 非常感谢。它解决了我的问题。我花了几天时间试图自己弄清楚。我发现了一个额外的链接here,它描述了如何在 xCode 中为内置 PNG 设置 pngcrush。
  • github 上的项目已更新。见here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
相关资源
最近更新 更多