unpackFloat.glsl 837 B

123456789101112131415161718192021222324
  1. /**
  2. * Unpack an IEEE 754 single-precision float that is packed as a little-endian unsigned normalized vec4.
  3. *
  4. * @name czm_unpackFloat
  5. * @glslFunction
  6. *
  7. * @param {vec4} packedFloat The packed float.
  8. *
  9. * @returns {float} The floating-point depth in arbitrary range.
  10. */
  11. float czm_unpackFloat(vec4 packedFloat)
  12. {
  13. // Convert to [0.0, 255.0] and round to integer
  14. packedFloat = floor(packedFloat * 255.0 + 0.5);
  15. float sign = 1.0 - step(128.0, packedFloat[3]) * 2.0;
  16. float exponent = 2.0 * mod(packedFloat[3], 128.0) + step(128.0, packedFloat[2]) - 127.0;
  17. if (exponent == -127.0)
  18. {
  19. return 0.0;
  20. }
  21. float mantissa = mod(packedFloat[2], 128.0) * 65536.0 + packedFloat[1] * 256.0 + packedFloat[0] + float(0x800000);
  22. float result = sign * exp2(exponent - 23.0) * mantissa;
  23. return result;
  24. }