在设备(iOS)上编码ASTC?

时间:2017-02-21 01:26:39

标签: ios textures metal astc

是否有任何库能够根据需要将图像数据编码为ASTC纹理? 我知道它是CPU密集型的,但无论如何都感兴趣。

3 个答案:

答案 0 :(得分:3)

在iOS 10中,Apple将ASTC编码添加到系统中。您可以通过/usr/include/AppleTextureEncoder.h,/usr/lib/libate.dylib或(更简单)访问它,只需使用通过CG / ImageIO.framework提供的常用图像编码工具编码到ASTC。请参阅CGImageDestination和关联的对象。也可以通过Xcode中的图像资产目录压缩来实现它。

系统ASTC编码器比ARM参考编码器快得多。支持块大小4x4和8x8。性能应类似于JPEG或PNG编码。

答案 1 :(得分:3)

import ImageIO
import MetalKit

let loader: MTKTextureLoader
let srcImage: CGImage
let ktxData = NSMutableData()
let dest = CGImageDestinationCreateWithData(ktxData, "org.khronos.ktx" as CFString, 1, nil)!
CGImageDestinationAddImage(dest, srcImage, 0, ["kCGImagePropertyASTCBlockSize": 0x88] as CFDictionary)
CGImageDestinationFinalize(dest)
try loader.newTexture(data: ktxData as Data, options: [])

显示的kCGImagePropertyASTCBlockSize选项可以获得8x8块大小(即每像素2位);唯一允许的其他大小是4x4(每像素8位),这是默认值。

要获得最佳效果,请将kCGImageDestinationLossyCompressionQuality: 0.0添加到CGImageDestinationAddImageFromSource

的选项中

其他可能的标志是kCGImagePropertyASTCUseLZFSEkCGImagePropertyASTCPreTwiddlekCGImagePropertyASTCFlipVerticallykCGImagePropertyASTCWeightChannelsEqually(所有bool)。

答案 2 :(得分:1)

https://github.com/ARM-software/astc-encoder是参考压缩器(由ARM和AMD创建)。在iOS设备上使用源代码可能并不困难。它可能过于缓慢,但它确实提供了各种速度选项,因此可能会为您在质量和速度之间取得适当的平衡。