pack.glslf 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef PACK_GLSLF
  2. #define PACK_GLSLF
  3. // Encoding Floats to RGBA by Aras Pranckevičius
  4. // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
  5. // float -> vec4
  6. vec4 pack(const in float value) {
  7. vec4 bit_shift = vec4(_255_0 * _255_0 * _255_0,
  8. _255_0 * _255_0, _255_0, _1_0);
  9. vec4 bit_mask = vec4(_0_0, _1_0 / _255_0,
  10. _1_0 / _255_0, _1_0 / _255_0);
  11. vec4 res = fract(value * bit_shift);
  12. res -= res.xxyz * bit_mask;
  13. return res;
  14. }
  15. float unpack_float(const in vec4 rgba_depth) {
  16. float depth;
  17. vec4 bit_shift = vec4(_1_0 / (_255_0 * _255_0
  18. * _255_0), _1_0 / (_255_0
  19. * _255_0), _1_0 / _255_0,
  20. _1_0);
  21. depth = dot(rgba_depth, bit_shift);
  22. return depth;
  23. }
  24. // vec2 -> vec4
  25. vec4 pack(const in vec2 vec) {
  26. vec2 bit_shift = vec2(_255_0, _1_0);
  27. vec2 bit_mask = vec2(_0_0, _1_0/_255_0);
  28. vec4 res = fract(vec.xxyy * bit_shift.xyxy);
  29. res -= res.xxzz * bit_mask.xyxy;
  30. if (vec.r == _1_0)
  31. res.rg = vec2(_0_0, _1_0);
  32. if (vec.g == _1_0)
  33. res.ba = vec2(_0_0, _1_0);
  34. return res;
  35. }
  36. vec2 unpack_vec2(const in vec4 rgba_vec) {
  37. vec2 vec;
  38. vec2 bit_shift = vec2(_1_0/_255_0, _1_0);
  39. vec.r = dot(rgba_vec.rg, bit_shift);
  40. vec.g = dot(rgba_vec.ba, bit_shift);
  41. return vec;
  42. }
  43. #endif