12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #ifndef PACK_GLSLF
- #define PACK_GLSLF
- // Encoding Floats to RGBA by Aras Pranckevičius
- // http://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
- // float -> vec4
- vec4 pack(const in float value) {
- vec4 bit_shift = vec4(_255_0 * _255_0 * _255_0,
- _255_0 * _255_0, _255_0, _1_0);
- vec4 bit_mask = vec4(_0_0, _1_0 / _255_0,
- _1_0 / _255_0, _1_0 / _255_0);
- vec4 res = fract(value * bit_shift);
- res -= res.xxyz * bit_mask;
- return res;
- }
- float unpack_float(const in vec4 rgba_depth) {
- float depth;
- vec4 bit_shift = vec4(_1_0 / (_255_0 * _255_0
- * _255_0), _1_0 / (_255_0
- * _255_0), _1_0 / _255_0,
- _1_0);
- depth = dot(rgba_depth, bit_shift);
- return depth;
- }
- // vec2 -> vec4
- vec4 pack(const in vec2 vec) {
- vec2 bit_shift = vec2(_255_0, _1_0);
- vec2 bit_mask = vec2(_0_0, _1_0/_255_0);
- vec4 res = fract(vec.xxyy * bit_shift.xyxy);
- res -= res.xxzz * bit_mask.xyxy;
- if (vec.r == _1_0)
- res.rg = vec2(_0_0, _1_0);
- if (vec.g == _1_0)
- res.ba = vec2(_0_0, _1_0);
- return res;
- }
- vec2 unpack_vec2(const in vec4 rgba_vec) {
- vec2 vec;
- vec2 bit_shift = vec2(_1_0/_255_0, _1_0);
- vec.r = dot(rgba_vec.rg, bit_shift);
- vec.g = dot(rgba_vec.ba, bit_shift);
- return vec;
- }
- #endif
|