[如何通过getBytes()读取.rgba16Float MTLTexture

问题描述 投票:0回答:1

我在读取像素格式为.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纹理执行相同操作?

swift metal
1个回答
0
投票

您可以使用vImage首先将缓冲区从16位浮点数转换为32位浮点数。签出vImageConvert_Planar16FtoPlanarF但是并不是网站上的文档是错误的(来自其他功能...)。我发现vImageConvert_Planar16FtoPlanarF可以演示该过程。

但是,如果可以使用Metal将纹理转换为32位浮点数(或者首先直接渲染为32位纹理,则效率会更高。

© www.soinside.com 2019 - 2024. All rights reserved.