我想从 iOS 中的文件加载 4 channel 纹理数据,所以我将纹理视为(连续)贴图
[0,1]x[0,1] -> [0,1]x[0,1]x[0,1]x[0,1]
如果我使用文件格式 .png
,XCode/iOS 会将文件视为图像,因此将每个组件 rgb
与 a
相乘(预乘 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/