Pack depth into RGB

Started by
0 comments, last by EsorU 12 years, 3 months ago
I came up with this approach, which seems to fix problems with other approaches on the net, and reduces errors across the whole [0,1] range to 0
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

Advertisement
Nice work, thanks for sharing!

This topic is closed to new replies.

Advertisement