Как считать текстуру .rgba16Float MTLTexture через getBytes () - PullRequest
1 голос
/ 14 февраля 2020

У меня проблемы с чтением MTLTexture с пиксельным форматом .rgba16Float, основная причина в том, что 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?

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете использовать vImage, чтобы сначала преобразовать буфер из 16-разрядного в 32-разрядное число с плавающей запятой. Проверьте vImageConvert_Planar16FtoPlanarF. Но не то, что документация на сайте неправильная (это из другой функции ...). Я обнаружил эту утилиту , которая демонстрирует процесс.

Однако было бы более эффективно, если бы вы могли использовать Metal для преобразования текстуры в 32-битный float (или непосредственно рендеринга в 32 текстура в первую очередь).

...