1

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

4

3 回答 3

8
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.0CGImageDestinationAddImageFromSource.

其他可能的标志是kCGImagePropertyASTCUseLZFSE, kCGImagePropertyASTCPreTwiddle,kCGImagePropertyASTCFlipVerticallykCGImagePropertyASTCWeightChannelsEqually(所有布尔值)。

于 2018-06-11T14:03:02.307 回答
4

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

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

于 2017-08-15T22:49:05.747 回答
1

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

于 2017-02-21T18:06:30.780 回答