Sign in to follow this  
skytiger

Pack depth into RGB

Recommended Posts

skytiger    294
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

[code]
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// 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

[/code]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this