2023-04-07 06:17:37 +00:00
|
|
|
#version 330 core
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Due to how GLSL shader linking works, we cannot share #defines or constants
|
|
|
|
* across multiple shaders. As a workaround, we create functions that return
|
|
|
|
* the constants. There should be no performance impact due to this because the
|
|
|
|
* compiler inlines the function calls.
|
|
|
|
*/
|
|
|
|
float M_PI() { return 3.14159265358979323846; } // pi
|
|
|
|
float M_2PI() { return 6.28318530717958647692; } // 2*pi
|
|
|
|
float M_4PI() { return 12.5663706143591729539; } // 4*pi
|
|
|
|
float M_PI_2() { return 1.57079632679489661923; } // pi/2
|
|
|
|
float M_PI_4() { return 0.78539816339744830962; } // pi/4
|
|
|
|
float M_1_PI() { return 0.31830988618379067154; } // 1/pi
|
|
|
|
float M_1_4PI() { return 0.07957747154594766788; } // 1/(4*pi)
|
|
|
|
|
|
|
|
float sqr(float x) {
|
|
|
|
return x * x;
|
|
|
|
}
|
|
|
|
|
|
|
|
float saturate(float x) {
|
|
|
|
return clamp(x, 0.0, 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
float safe_sqrt(float x) {
|
|
|
|
return sqrt(max(x, 0.0));
|
|
|
|
}
|
|
|
|
|
|
|
|
float safe_acos(float x) {
|
|
|
|
return acos(clamp(x, -1.0, 1.0));
|
|
|
|
}
|
|
|
|
|
|
|
|
float pow5(float x) {
|
|
|
|
float x2 = x*x;
|
|
|
|
return x2 * x2 * x;
|
|
|
|
}
|
2023-10-03 23:56:47 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Random number between 0 and 1, using interleaved gradient noise.
|
|
|
|
* uv must not be normalized.
|
|
|
|
*/
|
|
|
|
float interleaved_gradient_noise(vec2 uv) {
|
|
|
|
const vec3 m = vec3(0.06711056, 0.00583715, 52.9829189);
|
|
|
|
return fract(m.z * fract(dot(uv, m.xy)));
|
|
|
|
}
|