【发布时间】:2017-02-21 01:26:39
【问题描述】:
是否有任何库能够按需将图像数据编码为 ASTC 纹理? 我知道这是 CPU 密集型的,但还是很感兴趣。
【问题讨论】:
是否有任何库能够按需将图像数据编码为 ASTC 纹理? 我知道这是 CPU 密集型的,但还是很感兴趣。
【问题讨论】:
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(所有布尔值)。
【讨论】:
kCGImagePropertyASTCBlockSize 以及 org.khronos.ktx UTI。
在 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 设备上运行可能并不难。它可能非常慢,但它确实提供了各种速度选项,因此也许有人会为您在质量和速度之间取得适当的平衡。
【讨论】: