是否有任何库能够按需将图像数据编码为 ASTC 纹理?我知道它是 CPU 密集型的,但无论如何都很感兴趣。
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
.
其他可能的标志是kCGImagePropertyASTCUseLZFSE
, kCGImagePropertyASTCPreTwiddle
,kCGImagePropertyASTCFlipVertically
和kCGImagePropertyASTCWeightChannelsEqually
(所有布尔值)。
在 iOS 10 中,Apple 为系统添加了 ASTC 编码。您可以通过 /usr/include/AppleTextureEncoder.h、/usr/lib/libate.dylib 访问它,或者(更简单)使用 CG/ImageIO.framework 提供的常用图像编码工具将其编码为 ASTC。请参阅 CGImageDestination 和相关对象。也可以通过 Xcode 中的图像资产目录压缩来获得它。
系统 ASTC 编码器比 ARM 参考编码器快得多。支持块大小 4x4 和 8x8。性能应该类似于 JPEG 或 PNG 编码。
https://github.com/ARM-software/astc-encoder是参考压缩器(由 ARM 和 AMD 创建)。让源代码在 iOS 设备上运行可能并不难。它可能非常慢,但它确实提供了各种速度选项,因此也许有人会为您在质量和速度之间取得适当的平衡。