圆角矩形

const float borderHalfThickness = 2.0;
const vec4 borderColor = vec4(1.0, 1.0, 0.0, 1.0);
const vec4 fillColor = vec4(1.0, 0.0, 0.0, 1.0);
const float cornerRadius = 45.0;
float computeRectSDF(vec2 p, vec2 halfSize, float radius) {
vec2 dist = abs(p) - halfSize + vec2(radius);
return min(max(dist.x, dist.y), 0.0) + length(max(dist, 0.0)) - radius;
}
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 halfRectSize = vec2(300.0, 150.0) - vec2(borderHalfThickness);
vec2 centeredPos = fragCoord - iResolution.xy / 2.0;
float distToEdge = computeRectSDF(centeredPos, halfRectSize, cornerRadius - borderHalfThickness);
vec4 colorInside = mix(vec4(0.0, 0.0, 0.0, 0.0), fillColor, step(0.0, -distToEdge));
distToEdge = abs(distToEdge) - borderHalfThickness;
float blendFactor = smoothstep(-1.0, 1.0, distToEdge);
fragColor = mix(borderColor, colorInside, blendFactor);
}
实心圆[效率高]

vec3 rgb(float r, float g, float b) {
return vec3(r / 255.0, g / 255.0, b / 255.0);
}
vec4 circle(vec2 uv, vec2 pos, float rad, vec3 color) {
float d = length(pos - uv) - rad;
float t = clamp(d, 0.0, 1.0);
return vec4(color, 1.0 - t);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
vec2 uv = fragCoord.xy;
vec2 center = iResolution.xy * 0.5;
float radius = 0.25 * iResolution.y;
vec4 layer1 = vec4(rgb(210.0, 222.0, 228.0), 1.0);
vec3 red = rgb(225.0, 95.0, 60.0);
vec4 layer2 = circle(uv, center, radius, red);
fragColor = mix(layer1, layer2, layer2.a);
}
线条圆

#define step(b, a) smoothstep(a, a - (fwidth(b) * 2.0), b)
void mainImage(out vec4 col, in vec2 uv)
{
float borderWidth = 0.025;
vec4 outColor = vec4(0.0, 0.0, 0.0 , 0.0);
vec4 color = vec4(1.0, 1.0, 1.0 , 0.0);
vec4 borderColor = vec4(0.0, 0.0, 1.0 , 0.0);
vec3 r = iResolution;
uv = ((2.0 * uv) - r.xy) / r.y;
float sdf = length(uv);
float inner = step(sdf, (1.0 - borderWidth));
float borderInner = step(sdf, 1.0);
color = mix(outColor, color, inner);
color = mix(color, borderColor, borderInner * (1.0 - inner));
col = color;
}
多边形[抗锯齿效果]

float dot2( in vec2 v ) { return dot(v, v); }
float cross2d( in vec2 v0, in vec2 v1 ) { return v0.x * v1.y - v0.y * v1.x; }
const int N = 5;
float sdPolygon( in vec2 p, in vec2[N] v )
{
const int num = v.length();
float d = dot(p - v[0], p - v[0]);
float s = 1.0;
for( int i = 0, j = num - 1; i < num; j = i, i++ )
{
vec2 e = v[j] - v[i];
vec2 w = p - v[i];
vec2 b = w - e * clamp( dot(w, e) / dot(e, e), 0.0, 1.0 );
d = min( d, dot(b, b) );
bvec3 cond = bvec3( p.y >= v[i].y,
p.y < v[j].y,
e.x * w.y > e.y * w.x );
if( all(cond) || all(not(cond)) ) s = -s;
}
return s * sqrt(d);
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
vec2 p = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
vec2 m = (2.0 * iMouse.xy - iResolution.xy) / iResolution.y;
vec2 v0 = 0.8 * cos( 0.40 * iTime + vec2(0.0, 2.00) + 0.0 );
vec2 v1 = 0.8 * cos( 0.45 * iTime + vec2(0.0, 1.50) + 1.0 );
vec2 v2 = 0.8 * cos( 0.50 * iTime + vec2(0.0, 3.00) + 2.0 );
vec2 v3 = 0.8 * cos( 0.55 * iTime + vec2(0.0, 2.00) + 4.0 );
vec2 v4 = 0.8 * cos( 0.60 * iTime + vec2(0.0, 1.00) + 5.0 );
vec2[] polygon = vec2[](v0, v1, v2, v3, v4);
float d = sdPolygon(p, polygon);
float borderLineWidth = 0.005;
vec4 outColor = vec4(0.0,0.0,0.0,0.0);
vec4 fillColor = vec4(0.0,0.0,0.0,1.0);
vec4 borderColor = vec4(1.0,0.0,0.0,1.0);
vec4 col = (d > 0.0) ? outColor : fillColor;
float aa = fwidth(d) * 0.5;
col = mix( col, borderColor, 1.0 - smoothstep(borderLineWidth - 0.006 - aa, borderLineWidth + 0.002 + aa, abs(d)) );
fragColor = col;
}