Furthermore this should exactly match the 24 bit fixed precision of a standard D24S8 depth buffer
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Pack Unit Float [0,1] into RGB24
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
float3 UnitToColor24New(in float depth) {
// Constants
const float3 scale = float3(1.0, 256.0, 65536.0);
const float2 ogb = float2(65536.0, 256.0) / 16777215.0;
const float normal = 256.0 / 255.0;
// Avoid Precision Errors
float3 unit = (float3)depth;
unit.gb -= floor(unit.gb / ogb) * ogb;
// Scale Up
float3 color = unit * scale;
// Use Fraction to emulate Modulo
color = frac(color);
// Normalize Range
color *= normal;
// Mask Noise
color.rg -= color.gb / 256.0;
return color;
}//function
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Unpack RGB24 into Unit Float [0,1]
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
float ColorToUnit24New(in float3 color) {
const float3 scale = float3(65536.0, 256.0, 1.0) / 65793.0;
return dot(color, scale);
}//function