How to know which Metal texture format to use? short or half?

657 views Asked by At

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?

1

There are 1 answers

3
Frank Rupprecht On BEST ANSWER

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 using half for memory efficiency (and since most devices don't support full float anyway), on macOS float 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. Otherwise bgra8unorm is fine.

In general, you should be using a texture format with the smallest memory footprint that fits your use case.