unpackFloat.glsl 943 B

123456789101112131415161718192021222324252627282930
  1. #define SHIFT_RIGHT_8 0.00390625 //1.0 / 256.0
  2. #define SHIFT_RIGHT_16 0.00001525878 //1.0 / 65536.0
  3. #define SHIFT_RIGHT_24 5.960464477539063e-8//1.0 / 16777216.0
  4. #define BIAS 38.0
  5. /**
  6. * Unpacks a vec4 value containing values expressable as uint8 to an arbitrary float.
  7. *
  8. * @name czm_unpackFloat
  9. * @glslFunction
  10. *
  11. * @param {vec4} packedFloat The packed float.
  12. *
  13. * @returns {float} The floating-point depth in arbitrary range.
  14. */
  15. float czm_unpackFloat(vec4 packedFloat)
  16. {
  17. packedFloat *= 255.0;
  18. float temp = packedFloat.w / 2.0;
  19. float exponent = floor(temp);
  20. float sign = (temp - exponent) * 2.0;
  21. exponent = exponent - float(BIAS);
  22. sign = sign * 2.0 - 1.0;
  23. sign = -sign;
  24. float unpacked = sign * packedFloat.x * float(SHIFT_RIGHT_8);
  25. unpacked += sign * packedFloat.y * float(SHIFT_RIGHT_16);
  26. unpacked += sign * packedFloat.z * float(SHIFT_RIGHT_24);
  27. return unpacked * pow(10.0, exponent);
  28. }