Name

unpack - unpacks a single values into different formatted values

Synopsis

half2  unpack_2half(float a);
float2 unpack_2ushort(float a);
half4  unpack_4byte(float a);
half4  unpack_4ubyte(float a);

Parameters

a
Value to unpack

Description

unpack_2half unpacks a 32-bit integer value into two 16-bit floating point value.

unpack_2ushort unpacks two 16-bit unsigned integer values from a and scales the results into individual floating point values between 0.0 and 1.0.

unpack_4byte unpacks four 8-bit integers from a and scales the results into individual 16- bit floating point values between -(128/127) and +(127/127).

unpack_4ubyte unpacks the four 8-bit integers in a and scales the results into individual 16- bit floating point values between 0.0 and 1.0.

Reference Implementation

unpack_2half could be implemented this way:

half2  unpack_2half
{
  result.x = (a >> 0) & 0xFF;
  result.y = (a >> 16) & 0xFF;
  return result;
}

unpack_2ushort could be implemented this way:

float2  unpack_2ushort
{
  float 2 result;
  result.x = ((x >> 0) & 0xFFFF) / 65535.0;
  result.y = ((x >> 16) & 0xFFFF) / 65535.0;
  return result;
}

unpack_4byte could be implemented this way:

half4  unpack_4byte(float a)
{
  half4 result;
  result.x = (((a >> 0) & 0xFF) - 128) / 127.0;
  result.y = (((a >> 8) & 0xFF) - 128) / 127.0;
  result.z = (((a >> 16) & 0xFF) - 128) / 127.0;
  result.w = (((a >> 24) & 0xFF) - 128) / 127.0;
  return result;
}

unpack_4ubyte could be implemented this way:

half4  unpack_4ubyte(float a)
{
  half4 result ;
  result.x = ((a >> 0) & 0xFF) / 255.0;
  result.y = ((a >> 8) & 0xFF) / 255.0;
  result.z = ((a >> 16) & 0xFF) / 255.0;
  result.w = ((a >> 24) & 0xFF) / 255.0;
  return result;
}

Profile Support

unpack is supported in fp30, fp40, gp4, gp5

See Also

pack