You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KSP-Conformal-Decals/Assets/Shaders/SDF.cginc

45 lines
1.1 KiB
HLSL

#ifndef SDF_INCLUDED
#define SDF_INCLUDED
// based on functions by Inigo Quilez
// https://iquilezles.org/www/articles/distfunctions2d/distfunctions2d.htm
// SDF of a box
float sdBox( in float2 p, in float2 b ) {
float2 d = abs(p)-b;
return length(max(d,0.0)) + min(max(d.x,d.y),0.0);
}
// SDF of a box with corner radius r
float sdRoundedBox( in float2 p, in float2 b, in float r ) {
float2 d = abs(p)-b+r;
return min(max(d.x,d.y),0.0) + length(max(d,0.0)) - r;
}
// SDF of a box with corner radius r, based on the current UV position
// UV must be ∈ (0,1), with (0,0) on one corner
float sdRoundedUVBox( float2 uv, float r ) {
float dx = ddx(uv.x);
float dy = ddy(uv.y);
float2 dim = abs(float2(1/dx, 1/dy));
float2 halfDim = dim / 2;
float2 pos = (dim * uv) - halfDim;
return sdRoundedBox(pos, halfDim, r);
}
inline float SDFdDist(float dist) {
return length(float2(ddx(dist), ddy(dist)));
}
inline float SDFAA(float dist, float ddist) {
float pixelDist = dist / ddist;
return saturate(0.5-pixelDist);
}
inline float SDFAA(float dist) {
return SDFAA(dist, SDFdDist(dist));
}
#endif