Apple's Metal examples alternate between using texture2D<float>
and texture2D<half>
, and I believe that the default pixel format of a MTKView
is bgra8unorm
. What determines if I should use float
or half
? Do I need to specify something on the CPU, or will textures using 128-bits-in-all float4s
be converted into halfs
automatically? How about the other way around if I pass-in a texture with a bgra8format? I am asking because I am trying to load textures using MTKTextureLoader as well as from plain byte data, and I'm not sure what format to use for the plain byte data so things are consistent. May I have clarification?
How to know which Metal texture format to use? short or half?
646 views Asked by synchronizer At
1
It really depends on your use case.
Loading: You can probably safely load your data into a texture with the same format as that data. When your render destination has a different format, Metal will perform the conversion for you.
Intermediates: The format of intermediate textures should really depend on the "resolution" (as in "number of bits") you need, which depends on the input data and the color space. If you only handle sRGB data, 8-bit textures are probably enough (unless you do some complicated processing that requires a higher precision). If you want to support a wide gamut (e.g. in Display P3 color space), you need more precision (
half
should be fine) and also want to be able to store values outside of the [0...255] range. On iOS I'd recommend usinghalf
for memory efficiency (and since most devices don't support full float anyway), on macOSfloat
is the default, I think.View: The pixel format of the view should really depend on the display. Most of the screens support the Display P3 color space now. For that, you should use the
bgra10_xr
format, since it's optimized for that case. Otherwisebgra8unorm
is fine.In general, you should be using a texture format with the smallest memory footprint that fits your use case.