slang-shaders/bezel/koko-aio/shaders-ng/includes/pack_unpack.include.slang
2023-09-28 16:26:48 +02:00

65 lines
1.8 KiB
Plaintext

/* pack_2to1_f and unpack_1to2_float
* Take 2 floats and pack them into one
* #pragma format R32G32B32A32_SFLOAT needed
* The brighter color is lost.
*/
#define pack_floats_clamp 0.996078431372549 //1-(1/255)
#define pack_floats_precision 255.0
float pack_2to1_f(vec2 in_float){
//Clamp and round to 1/255 needed:
in_float = min(in_float,pack_floats_clamp);
in_float = floor(in_float*255.0)/255.0;
return in_float.x*pack_floats_precision + in_float.y;
}
vec2 unpack_1to2_float(float f){
float fr = fract(f);
float fg = floor(f)/pack_floats_precision;
return vec2(fr,fg);
}
//pack 2 vec3 into one
vec3 pack_2to1_vec3(vec3 v1, vec3 v2) {
return vec3(
pack_2to1_f(vec2(v1.r,v2.r)),
pack_2to1_f(vec2(v1.g,v2.g)),
pack_2to1_f(vec2(v1.b,v2.b))
);
}
void unpack_1to2_vec3(in vec3 v, out vec3 v1, out vec3 v2) {
vec2 t;
t.xy = unpack_1to2_float(v.r);
v1.r = t.x;
v2.r = t.y;
t.xy = unpack_1to2_float(v.g);
v1.g = t.x;
v2.g = t.y;
t.xy = unpack_1to2_float(v.b);
v1.b = t.x;
v2.b= t.y;
}
/* packColor and unpackColor
* Take a vec3 and pack them into one float
* #pragma format R32G32B32A32_SFLOAT needed
* The brighter colors (2) are lost.
*/
#define mul_low 65025.0 //(pow(255.0,2.0))
#define mul_mid 16581375.0 //(pow(255.0,3.0))
#define mul_hi 4228250625.0 //(pow(255.0,4.0))
#define pack_color_clamp 0.992156862745098 // 1.0-(2.0/255)
float packColor(vec3 color) {
color = clamp(color,0.0, pack_color_clamp);
color = floor(color*255.0)/255.0;
return (color.b * mul_low) + (color.g * mul_mid) + (color.r * mul_hi) ;
}
vec3 unpackColor(float result) {
float hi = floor(result/mul_mid)*mul_mid;
float mid = floor((result - hi)/mul_low)*mul_low;
float low = result - hi - mid;
return vec3(hi/mul_hi, mid/mul_mid, low/mul_low);
}