Am I correct in my assumption that reading a value from .r16SNorm texture into Metal Shading Language half data type always unavoidably incur precision loss? It wasn't obvious to me from the start because they both 16-bit formats. But I guess .r16SNorm can store much more precise values in its interval [-1, 1] at the expense of dropping any values outside of this interval. Basically if I understand correctly UNorm and SNorm formats don't have any exponent bits and use all 16-bits for significand and sign exclusively thus dramatic difference in precision compared to half.
Does it mean that its almost never makes sense to read from r16SNorm to anything other then float? Or maybe there is a way to "renormalize" is somehow?
// texture is in .r16SNorm pixel format
texture2d<half, access::sample> texture [[texture(0)]]
...
// float is fine
float value = texture.sample(sampler, pixel).x;
// half is never enough to store normalized 16-bit???
half value = texture.sample(sampler, pixel).x;