ios - 在 iOS 中加载 4 channel 纹理数据

标签 ios opengl-es-2.0 textures premultiplied-alpha

我想从 iOS 中的文件加载 4 channel 纹理数据,所以我将纹理视为(连续)贴图

[0,1]x[0,1] -> [0,1]x[0,1]x[0,1]x[0,1]

如果我使用文件格式 .png,XCode/iOS 会将文件视为图像,因此将每个组件 rgba 相乘(预乘 alpha),破坏了我的数据。我应该如何解决这个问题?例子可能是

  • 使用两个纹理和组件 rgb(3 channel )
  • 后除法
  • 使用另一种文件格式

其中,我认为最好的解决方案是使用另一种文件格式。 GL 压缩文件格式 (PVRTC?) 与 Apple 平台无关,似乎分辨率较低(4 位)( reference )。

编辑: 如果我自己在下面的回答是正确的,则不可能在 iOS 中获取 png 的 4 channel 数据。由于 OpenGL 是关于创建图像而不是呈现图像,因此应该可以以某种方式加载 4 channel 数据。 png 是一种图像文件格式(压缩取决于所有 4 个 channel ,但一个 channel 的压缩独立于其他 channel ),所以有人可能会争辩说我应该使用另一种文件格式。那么我应该使用哪些其他压缩文件格式,以便在 iOS 中读取/集成?

更新:“combinatorial”提到了一种加载 4 channel 非预乘纹理的方法,所以我不得不给他正确的答案。但是,该解决方案有一些我不喜欢的限制。我的下一个问题是“从 iOS 中的 png 文件访问原始 4 channel 数据”:)

我认为这是一个糟糕的库设计,无法读取 4 channel png 数据。我不喜欢试图比我更聪明的系统。

最佳答案

当你考虑 PVRTC 然后使用 GLKit可能是一个选择。这包括 GLKTextureLoader它允许您在不预乘 alpha 的情况下加载纹理。使用例如:

+ (GLKTextureInfo *)textureWithContentsOfFile:(NSString *)fileName options:(NSDictionary *)textureOperations error:(NSError **)outError

并传递包含以下内容的选项字典:

GLKTextureLoaderApplyPremultiplication = NO

关于ios - 在 iOS 中加载 4 channel 纹理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336241/

相关文章:

java - libGDX - 在图像周围制作边框

ios - 如何摆脱导航栏和手机顶部之间的空间

android - PowerVR-SGX500 系列异常行为

debugging - WebGL 调试工具?

ipad - iPad 上可用的最大纹理尺寸是多少?

Three.js - 多种 Material 平面

ios - 错误 : message sent to deallocated instance in

iphone - 在应用程序处于后台时计时器用完后,如何让应用程序发送 GPS 位置?

ios - 我遇到这样的错误,我想到了 tableView,但我在堆栈跟踪中看到了有关 FBSDK 的信息

iphone - glDrawElements VAO/VBO 在 iOS 上崩溃