Name
pack - packs mutiple values into a single 32-bit result
Synopsis
float pack_2half(float2 a);
float pack_2half(half2 a);
float pack_2ushort(float2 a);
float pack_2ushort(half2 a);
float pack_4byte(float4 a);
float pack_4byte(half4 a);
float pack_4ubyte(float4 a);
float pack_4ubyte(half4 a);
Parameters
- a
-
Value to pack
Description
pack_2half converts the components of a into a pair of 16-bit floating point values. The
two converted components are then packed into a single 32-bit result.
pack_2ushort converts the components of a into a pair of 16-bit unsigned integers. The two
converted components are then packed into a single 32-bit return value.
pack_4byte converts the four components of a into 8-bit signed integers. The signed
integers are such that a representation with all bits set to 0 corresponds to the
value -(128/127), and a representation with all bits set to 1 corresponds to
+(127/127). The four signed integers are then packed into a single 32-bit
result.
pack_4ubyte converts the four components of a into 8-bit unsigned integers. The
unsigned integers are such that a representation with all bits set to 0
corresponds to 0.0, and a representation with all bits set to 1 corresponds to
1.0. The four unsigned integers are then packed into a single 32-bit result.
Reference Implementation
pack_2half could be implemented this way:
float pack_2half(float2 a)
{
float result;
return result = (((half)a.y) << 16) | (half)a.x;
}
pack_2ushort could be implemented this way:
float pack_2ushort(float2 a)
{
float result;
ushort.x = round(65535.0 * clamp(a.x, 0.0, 1.0));
ushort.y = round(65535.0 * clamp(a.y, 0.0, 1.0));
result = (ushort.y << 16) | ushort.y;
return result;
}
pack_4byte could be implemented this way:
float pack_2half(half2 a)
{
float result;
ub.y = round(127 * clamp(a.y, -128/127, 127/127) + 128);
ub.z = round(127 * clamp(a.z, -128/127, 127/127) + 128);
ub.w = round(127 * clamp(a.w, -128/127, 127/127) + 128);
return result = (ub.w << 24) | (ub.z << 16) | (ub.y << 8) | ub.x;
}
pack_4ubyte could be implemented this way:
float pack_4ubyte(float4 a)
{
float result;
ub.x = round(255.0 * clamp(a.x, 0.0, 1.0));
ub.y = round(255.0 * clamp(a.y, 0.0, 1.0));
ub.z = round(255.0 * clamp(a.z, 0.0, 1.0));
ub.w = round(255.0 * clamp(a.w, 0.0, 1.0));
result = (ub.w << 24) | (ub.z << 16) | (ub.y << 8) | ub.x;
return result;
}
Profile Support
pack is supported in fp30, fp40, gp4, gp5
See Also
unpack
|