在设备上编码 ASTC (iOS)?

Encode ASTC on device (iOS)?

有没有库可以按需将图像数据编码为ASTC纹理? 我知道这是 CPU 密集的,但无论如何我都很感兴趣。

https://github.com/ARM-software/astc-encoder 是参考压缩器(由 ARM 和 AMD 创建)。让源代码在 iOS 设备上运行可能并不难。它可能慢得令人望而却步,但它确实提供了多种速度选项,因此也许有人会为您在质量和速度之间取得适当的平衡。

在iOS10,Apple在系统中添加了ASTC编码。您可以通过 /usr/include/AppleTextureEncoder.h、/usr/lib/libate.dylib 或(更简单)使用通过 CG / ImageIO.framework 提供的常用图像编码实用程序编码为 ASTC 来访问它。请参阅 CGImageDestination 和相关对象。也可以通过 Xcode.

中的图像资产目录压缩来获取它

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

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(所有布尔值)。