Pack depth into RGB

This topic is 2550 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

Recommended Posts

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 

Share on other sites
Nice work, thanks for sharing!

1. 1
2. 2
Rutin
20
3. 3
4. 4
A4L
15
5. 5
khawk
14

• 13
• 26
• 10
• 11
• 9
• Forum Statistics

• Total Topics
633737
• Total Posts
3013614
×