我在读取像素格式为.rgba16Float的MTLTexture时遇到问题,主要原因是Swift似乎没有对应的SIMD4格式。
对于.rgba32Float,我可以像这样简单地使用SIMD4
if let texture = texture {
let region = MTLRegionMake2D(x, y, 1, 1)
let texArray = Array<SIMD4<Float>>(repeating: SIMD4<Float>(repeating: 0), count: 1)
texture.getBytes(UnsafeMutableRawPointer(mutating: texArray), bytesPerRow: (MemoryLayout<SIMD4<Float>>.size * texture.width), from: region, mipmapLevel: 0)
let value = texArray[0]
}
这在Swift Float数据类型为32位时效果很好,如何对16位.rgba16Float纹理执行相同操作?
您可以使用vImage首先将缓冲区从16位浮点数转换为32位浮点数。签出vImageConvert_Planar16FtoPlanarF
。 但是并不是网站上的文档是错误的(来自其他功能...)。我发现vImageConvert_Planar16FtoPlanarF
可以演示该过程。
但是,如果可以使用Metal将纹理转换为32位浮点数(或者首先直接渲染为32位纹理,则效率会更高。