[GD-General] Representable range mini-rant
Brought to you by:
vexxed72
From: Jon W. <hp...@mi...> - 2006-10-03 21:40:16
|
This is about representation of data, specifically with respects to closed intervals, and using fixed point representation. For example, representing components for normals, you need the range [-1,1]. (let's ignore the dropping of components for compression reasons for now) Same thing with various tree coordinates (if you allow the topmost coordinate value), vertex components, and pretty much any other quantity. This gets annoying when you are dealing with fixed point data. This is perhaps made most famous with the color->byte conversion, where 255 means 1.0. The problem with this is that you can't exactly represent the midpoint (0.5 maps to 127.5, in this case). If all you want to do is representing the midpoint, you can throw away the top value, and represent 1.0 using 254, and thus 0.5 as 127. For example, with sound samples, and geo-measurement data, it's common to make -32768 mean "no data" or "invalid", and normalize -32767 to 32767 as the peak-to-peak range. However, then you run into the same problem with mid-midpoints, which isn't so much a problem for colors (or audio samples), but a whole other kettle of fish for trees of various kinds, or vertex values that need to quantize into some tree-based structure. What I find myself doing is repersenting the midpoint and the two endpoints, and throwing away almost a whole bit of precision. For example, to represent 0..1 using 8 bits, I'd represent 0 as 0, and 1 as 128, and then "throwing away" data in the range 129-255. For data that needs more precision, I'd represent it using 16 bits, with 32768 being 1.0 and 0 being 0.0, and ignoring values 32769 through 65535. It just annoys me that I leave almost a whole bit (6 dB!) of dynamic range un-used, but for these cases (closed ranges, must support subdivision) I really don't see any better option. Comments? Cheers, / h+ |