qskinny/playground/shadows/boxshadow.frag

43 lines
1011 B
GLSL
Raw Normal View History

2020-10-06 15:49:46 +02:00
uniform lowp float opacity;
2021-09-18 14:48:25 +02:00
uniform lowp float blurExtent;
2020-10-06 15:49:46 +02:00
uniform lowp vec4 radius;
uniform lowp vec4 color;
uniform lowp vec2 aspect;
varying lowp vec2 coord;
lowp float effectiveRadius( in lowp vec4 radii, in lowp vec2 point )
{
2021-09-18 14:48:25 +02:00
if ( point.x > 0.0 )
return ( point.y > 0.0) ? radii.x : radii.y;
else
return ( point.y > 0.0) ? radii.z : radii.w;
2020-10-06 15:49:46 +02:00
}
void main()
{
2021-09-18 14:48:25 +02:00
lowp vec4 col = vec4(0.0);
if ( opacity > 0.0 )
{
const lowp float minRadius = 0.05;
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
lowp float e2 = 0.5 * blurExtent;
lowp float r = 2.0 * effectiveRadius( radius, coord );
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
lowp float f = minRadius / max( r, minRadius );
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
r += e2 * f;
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
lowp vec2 d = r + blurExtent - aspect * ( 1.0 - abs( 2.0 * coord ) );
lowp float l = min( max(d.x, d.y), 0.0) + length( max(d, 0.0) );
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
lowp float shadow = l - r;
2020-10-06 15:49:46 +02:00
2021-09-18 14:48:25 +02:00
lowp float v = smoothstep( -e2, e2, shadow );
col = mix( color, vec4(0.0), v ) * opacity;
}
2020-10-06 15:49:46 +02:00
gl_FragColor = col;
}