pack
Keywords: pack, NVIDIA, NVIDIA Cg Toolkit, Cg Toolkit, Shader, Shader Programming, GPU Shader Programming, GPU Program

> ## 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