95 lines
2.3 KiB
GLSL
95 lines
2.3 KiB
GLSL
// these are shaping functions taken from various places of https://flong.com
|
|
|
|
// Polynominal shaping
|
|
|
|
float blinn_wyvill_cos_approx(float x) {
|
|
float x2 = x*x;
|
|
float x4 = x2*x2;
|
|
float x6 = x4*x2;
|
|
|
|
float fa = ( 4.0/9.0);
|
|
float fb = (17.0/9.0);
|
|
float fc = (22.0/9.0);
|
|
|
|
return fa*x6 - fb*x4 + fc*x2;
|
|
}
|
|
|
|
// TODO: factor out clamping
|
|
float double_cubic_seat(float x, vec2 ab) {
|
|
float epsilon = 0.00001;
|
|
float min_param_a = 0.0 + epsilon;
|
|
float max_param_a = 1.0 - epsilon;
|
|
float min_param_b = 0.0;
|
|
float max_param_b = 1.0;
|
|
float a = clamp(ab.x, min_param_a, max_param_a);
|
|
float b = clamp(ab.y, min_param_b, max_param_b);
|
|
|
|
if (x <= a){
|
|
return b - b*pow(1.-x/a, 3.0);
|
|
}
|
|
return b + (1.-b)*pow((x-a)/(1.-a), 3.0);
|
|
}
|
|
|
|
float double_cubic_seat_linear_blend(float x, vec2 ab) {
|
|
float epsilon = 0.00001;
|
|
float min_param_a = 0.0 + epsilon;
|
|
float max_param_a = 1.0 - epsilon;
|
|
float min_param_b = 0.0;
|
|
float max_param_b = 1.0;
|
|
float a = clamp(ab.x, min_param_a, max_param_a);
|
|
float b = clamp(ab.y, min_param_b, max_param_b);
|
|
b = 1.0 - b;
|
|
|
|
if (x<=a){
|
|
return b*x + (1.-b)*a*(1.-pow(1.-x/a, 3.));
|
|
}
|
|
return b*x + (1.-b)*(a + (1.-a)*pow((x-a)/(1.-a), 3.));
|
|
}
|
|
|
|
float double_odd_polynomial_seat(float x, float a, float b, float n) {
|
|
float epsilon = 0.00001;
|
|
float min_param_a = 0.0 + epsilon;
|
|
float max_param_a = 1.0 - epsilon;
|
|
float min_param_b = 0.0;
|
|
float max_param_b = 1.0;
|
|
a = clamp(a, min_param_a, max_param_a);
|
|
b = clamp(b, min_param_b, max_param_b);
|
|
|
|
float p = 2.*n + 1.;
|
|
if (x <= a){
|
|
return b - b*pow(1.-x/a, p);
|
|
}
|
|
return b + (1.-b)*pow((x-a)/(1.-a), p);
|
|
}
|
|
|
|
float double_poly_sigmoid(float x, float a, float b, float n) {
|
|
if(mod(n, 2.) == 0.) {
|
|
if(x <= 0.5) {
|
|
return pow(2.0*x, n)/2.0;
|
|
}
|
|
return 1.0 - pow(2.*(x-1.), n)/2.0;
|
|
} else {
|
|
if (x<=0.5){
|
|
return pow(2.0*x, n)/2.0;
|
|
}
|
|
return 1.0 + pow(2.0*(x-1.), n)/2.0;
|
|
}
|
|
}
|
|
|
|
float quad_through_point(float x, vec2 ab) {
|
|
float epsilon = 0.00001;
|
|
float min_param_a = 0.0 + epsilon;
|
|
float max_param_a = 1.0 - epsilon;
|
|
float min_param_b = 0.0;
|
|
float max_param_b = 1.0;
|
|
float a = clamp(ab.x, min_param_a, max_param_a);
|
|
float b = clamp(ab.y, min_param_b, max_param_b);
|
|
|
|
float A = (1.-b)/(1.-a) - (b/a);
|
|
float B = (A*(a*a)-b)/a;
|
|
float y = A*(x*x) - B*(x);
|
|
y = clamp(0., 1., y);
|
|
|
|
return y;
|
|
}
|