I have a Metal texture, I want to access its data from Swift by making it a float4 array (so that I can access each pixel 4 color components).
I discovered this method of MTLTexture
:
getBytes(UnsafeMutableRawPointer, bytesPerRow: Int, bytesPerImage: Int, from: MTLRegion, mipmapLevel: Int, slice: Int)
I don't know at all how to use UnsafeMutableRawPointer, how it works, and how to get the data back into a simple Swift array.
My first attempt was to create a pointer and allocate enough space like that, but I don't even know if that's what I should do:
var pointer = UnsafeMutableRawPointer.allocate(bytes: myTextureSizeInBytes, alignedTo: 0)
Then I have no idea at all of how to get this data back into a standard Swift array...
Thank you.
Another option is to create an array of the appropriate size and pass the address to the underlying storage to the function:
Inside the closure,
$0
is aUnsafeMutableRawBufferPointer
representing the array storage as a collection of bytes, and$0.baseAddress
is a pointer to the first byte.First, let's assume you have a
UnsafeRawPointer
and a length:Now you want to convert that to an
[float4]
. First, you can convert yourUnsafeRawPointer
to a typed pointer by binding it to a type:Now you can convert that to a typed buffer pointer:
And since a buffer is a collection, you can initialize an array with it:
For much more on working with
UnsafeRawPointer
, see SE-0138, SE-0107, and the UnsafeRawPointer Migration Guide.This is a Swift 4 example of converting a literal UInt8 array to an UnsafeMutableRawPointer and back to an UInt32 array