Preview
#ifdef GL_ES
precision mediump float;
#endif
#extension GL_OES_standard_derivatives : enable
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
vec3 skinColor1 = vec3(0.996,0.921,0.862);
vec3 skinColor2 = vec3(0.960,0.843,0.749);
vec3 hairColor = vec3(0.176,0.180,0.196);
vec3 hairColor2 = vec3(0.100,0.100,0.100);
vec3 mayuColor = vec3(0.160,0.078,0.058);
vec3 mayuColor2 = vec3(0.219,0.121,0.098);
vec3 eyeColorB = vec3(0.317,0.184,0.149);
vec3 eyeColorH = vec3(0.807,0.607,0.501);
vec3 eyeColorS = vec3(0.756,0.717,0.709);
vec3 ripColor = vec3(0.925,0.737,0.650);
vec3 fukuColor = vec3(0.968,0.701,0.415);
vec3 blackColor = vec3(0,0,0);
vec3 whiteColor = vec3(1,1,1);
vec3 whiteColor2= vec3(0.9,0.9,0.9);
vec3 RedColor = vec3(0.9,0.2,0.2);
vec3 OrangeColor= vec3(0.901,0.568,0.215);
void Face(inout vec2 p, inout vec3 col)
{
//back hair
if ((length(vec2(1,0.4)*(p-vec2(-0.45,0.06))) < 0.4)
&&(abs(p.x+0.7) < 0.2 && abs(p.y+0.3) < 0.5)
) col = blackColor; // hairBack1
if ((length(vec2(1,0.5)*(p-vec2(-0.6,0.15))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(-0.3,-0.2))) > 0.5)
&&(abs(p.x+0.9) < 0.2 && abs(p.y+0.3) < 0.5)
) col = blackColor; // hairBack2
if ((length(vec2(0.7,1)*(p-vec2(0.05,-1.2))) < 0.404)) col = eyeColorB; // kubi
if ((length(vec2(0.7,1)*(p-vec2(0.05,-1.2))) < 0.4)) col = OrangeColor; // kubi
if ((length(vec2(1,0.71)*(p-vec2(0.04,-1.1))) < 0.3)) col = eyeColorB; // kubi
if ((length(vec2(1,0.71)*(p-vec2(0.03,-1.1))) < 0.3)) col = skinColor2; // kubi
//base
if ((length(vec2(0.73,1)*(p-vec2(-0.21,-0.21))) < 0.8)
&&(length(vec2(0.8,1)*(p-vec2(0.3,-0.29))) < 0.8)
) col = eyeColorB; // face base
if ((length(vec2(0.73,1)*(p-vec2(-0.21,-0.20))) < 0.8)
&&(length(vec2(0.8,1)*(p-vec2(0.3,-0.28))) < 0.8)
) col = skinColor2; // face base
if ((length(vec2(1,0.71)*(p-vec2(-0.01,0.26))) < 0.905)
&&(length(vec2(1,0.73)*(p-vec2(-0.15,0.22))) < 0.9)
) col = eyeColorB; // face base
if ((length(vec2(1,0.71)*(p-vec2(-0.01,0.26))) < 0.9)
&&(length(vec2(1,0.73)*(p-vec2(-0.15,0.22))) < 0.9)
) col = skinColor1; // face base
if (length(p-vec2(-0.2,-0.6)) < 0.1) col = mix(skinColor2, skinColor1, (length(p-vec2(-0.2,-0.6))*whiteColor) / 0.11);//nose
//mouth
if ((length(vec2(0.9,1)*(p-vec2(-0.16,-0.645))) < 0.17)
&&(length(vec2(0.5,1)*(p-vec2(-0.16,-0.62))) > 0.156)
) col = mix(ripColor, skinColor1, (length(p-vec2(-0.16,-0.75))*whiteColor) / 0.17); //ripcolor1
if ((length(vec2(0.5,1)*(p-vec2(-0.16,-0.922))) < 0.17)
&&(length(vec2(0.2,1)*(p-vec2(-0.16,-0.953))) > 0.18)
) col = mix(ripColor, skinColor1, (length(p-vec2(-0.16,-0.85))*whiteColor) / 0.17); //ripcolor1
if ((length(vec2(0.5,1)*(p-vec2(-0.16,-0.64))) < 0.14)
&&(length(vec2(0.5,1)*(p-vec2(-0.16,-0.62))) > 0.157)
) col = mayuColor; //mouth
if (length(p-vec2(-0.18,-0.795)) < 0.01) col = whiteColor; // hilight1
if (length(p-vec2(-0.16,-0.795)) < 0.005) col = whiteColor; // hilight1
}
void RightEye(inout vec2 p, inout vec3 col)
{
//bases
if (length(vec2(1,0.6)*(p-vec2(-0.58,-0.12))) < 0.15) col = whiteColor; // base1-1
if (length(vec2(1,0.59)*(p-vec2(-0.645,-0.079))) < 0.11)col = whiteColor; // base1-2
if ((length(vec2(1,0.6)*(p-vec2(-0.603,-0.12))) < 0.159)
&&(length(vec2(1,0.9)*(p-vec2(-0.61,-0.18))) > 0.2)) col = eyeColorS; // eyeline kage
if (length(vec2(1,0.55)*(p-vec2(-0.58,-0.115))) < 0.11) col = blackColor; // base2-1
if (length(vec2(1,0.56)*(p-vec2(-0.59,-0.08))) < 0.115) col = blackColor; // base2-2
if (length(vec2(1,0.55)*(p-vec2(-0.58,-0.115))) < 0.103) col = eyeColorB; // base3-1
if (length(vec2(1,0.56)*(p-vec2(-0.59,-0.08))) < 0.103) col = eyeColorB; // base3-2
if ((length(p-vec2(-0.62,0.0)) < 0.17)
&&(length(vec2(1,0.56)*(p-vec2(-0.59,-0.08))) < 0.103)
)col = (length(p-vec2(-0.62,0.0))*eyeColorB) / 0.17; //eye base shadow
if ((length(p-vec2(-0.55,-0.28)) < 0.12)
&&(length(vec2(1,0.55)*(p-vec2(-0.58,-0.115))) < 0.103)
)col = mix(eyeColorH, eyeColorB, (length(p-vec2(-0.55,-0.28))*whiteColor) / 0.12); // eye base hilight
//center
if (length(vec2(1,0.4)*(p-vec2(-0.59,-0.11))) < 0.042) col = mayuColor; //eye center1
if (length(vec2(1,0.36)*(p-vec2(-0.59,-0.11))) < 0.036) col = (length(vec2(1,0.5)*(p-vec2(-0.59,-0.11)))*eyeColorB) / 0.05; // eye center2
if (length(p-vec2(-0.59,-0.11)) < 0.017) col = blackColor; // eye center 3
// hilight
if (length(vec2(0.6,1)*(p-vec2(-0.53,0.01))) < 0.027) col = whiteColor; //hilight1
if (length(p-vec2(-0.67,-0.22)) < 0.026) col = whiteColor; // hilight2
if (length(p-vec2(-0.61,-0.16)) < 0.015) col = (0.002 / (length(p-vec2(-0.61,-0.16))*whiteColor)) + mayuColor; // hilight3
// blow
if ((length(vec2(1,0.6)*(p-vec2(-0.6,-0.15))) < 0.175)
&&(length(vec2(1,0.56)*(p-vec2(-0.63,-0.179))) > 0.16)
&&(length(vec2(1,0.59)*(p-vec2(-0.58,-0.2))) > 0.16)
) col = mayuColor; //eyeblow1-1
if ((length(vec2(1,0.55)*(p-vec2(-0.65,-0.05))) < 0.12)
&&(length(vec2(1,0.8)*(p-vec2(-0.615,-0.055))) > 0.13)
&&(length(vec2(1,0.56)*(p-vec2(-0.645,-0.09))) > 0.11)
) col = mayuColor; //eyeblow1-2
if ((length(vec2(1,0.8)*(p-vec2(-0.631,-0.045))) < 0.17)
&& (length(vec2(0.8,1)*(p-vec2(-0.65,-0.07))) > 0.2)
) col = mayuColor; //eyeblow1-2
if ((length(vec2(1,0.97)*(p-vec2(-0.65,-0.0))) < 0.2)
&&(length(vec2(1,0.9)*(p-vec2(-0.65,-0.085))) > 0.25)) col = mayuColor; //mayu
}
void LeftEye(inout vec2 p, inout vec3 col)
{
// sizeraito x y pos x y size
// bases
if (length(vec2(1,0.9)*(p-vec2(0.36,-0.12))) < 0.25) col = whiteColor; // base
if ((length(vec2(1,0.9)*(p-vec2(0.36,-0.12))) < 0.25)
&&(length(vec2(0.9,1)*(p-vec2(0.36,-0.2))) > 0.25)) col = eyeColorS; // eyeline kage
if (length(vec2(1,0.75)*(p-vec2(0.358,-0.11))) < 0.17) col = blackColor;
if (length(vec2(1,0.75)*(p-vec2(0.358,-0.11))) < 0.16) col = eyeColorB; //base 2
if ((length(p-vec2(0.34,0.0)) < 0.17)
&&(length(vec2(1,0.75)*(p-vec2(0.358,-0.11))) < 0.16))col = (length(p-vec2(0.34,0.0))*eyeColorB) / 0.17; //eye base shadow
if ((length(p-vec2(0.4,-0.28)) < 0.17)
&&(length(vec2(1,0.75)*(p-vec2(0.358,-0.11))) < 0.16))col = mix(eyeColorH, eyeColorB, (length(p-vec2(0.4,-0.28))*whiteColor) / 0.17); // eye base hilight
// center
if (length(vec2(1,0.60)*(p-vec2(0.358,-0.11))) < 0.07) col = mayuColor; //eye center1
if (length(vec2(1,0.55)*(p-vec2(0.358,-0.11))) < 0.06) col = (length(p-vec2(0.358,-0.11))*eyeColorB) / 0.1; // eye center2
if (length(p-vec2(0.358,-0.11)) < 0.025) col = blackColor; // eye center 3
// hilight
if (length(vec2(0.6,1)*(p-vec2(0.46,0.029))) < 0.035) col = whiteColor; //hilight1
if (length(p-vec2(0.25,-0.27)) < 0.03) col = whiteColor; // hilight2
if (length(p-vec2(0.325,-0.16)) < 0.025) col = (0.003 / (length(p-vec2(0.325,-0.16))*whiteColor)) + mayuColor; // hilight3
// blow
if ((length(vec2(1,0.9)*(p-vec2(0.37,-0.115))) < 0.265)
&&(length(vec2(1,0.9)*(p-vec2(0.36,-0.175))) > 0.255)) col = mayuColor; //eyeblow1
if ((length(vec2(1,1.1)*(p-vec2(0.37,-0.1))) < 0.3)
&&(length(vec2(1,1.4)*(p-vec2(0.41,-0.15))) > 0.38)
&&(length(p-vec2(0.5,-0.1)) > 0.3)
) col = mayuColor; //eyeblow2
if ((length(vec2(1,1)*(p-vec2(0.87,0.08))) < 0.3)
&&(length(vec2(1,0.9)*(p-vec2(0.9,0.08))) > 0.3)
&&(length((p-vec2(0.83,0.2))) > 0.3)
) col = mayuColor; //eyeblow3
if ((length(vec2(1,0.9)*(p-vec2(0.37,-0.115))) < 0.245)
&&(length(vec2(1,0.9)*(p-vec2(0.36,-0.175))) > 0.27)) col = mayuColor2; //eyeblow4
if ((length(vec2(0.97,1)*(p-vec2(0.38,-0.18))) < 0.4)
&&(length(vec2(0.9,1)*(p-vec2(0.38,-0.2))) > 0.4)) col = mayuColor; //mayu
if ((length(vec2(1,0.5)*(p-vec2(-0.81,0.46))) < 0.2)) col = skinColor2; // hair kage
}
void Hair(inout vec2 p, inout vec3 col)
{
if ((length(vec2(1,0.5)*(p-vec2(-0.23,0.4))) < 0.25)) col = skinColor2; // hair kage
if ((length(p-vec2(-0.4,0.6)) < 0.7)&&(length(p-vec2(-1.3,0.61)) < 0.7))col = hairColor; // hair1
if ((length(p-vec2(0.09,0.5)) < 0.7)&&(length(p-vec2(-0.72,0.42)) < 0.7))col = hairColor; // hair1
if ((length(p-vec2(0.63,0.75)) < 0.7)&&(length(p-vec2(-0.05,0.6)) < 0.7))col = hairColor; // hair2
if ((length(vec2(0.7,1)*(p-vec2(-0.4,0.9))) < 0.4)) col = hairColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(0.7,0.01))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(0.55,-0.1))) > 0.5)
&&(abs(p.x-0.9) < 0.3 && abs(p.y+0.92) > 0.2)
) col = blackColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(0.54,0.38))) < 0.26)
&&(length(vec2(1,0.5)*(p-vec2(0.35,0.0))) > 0.26)
) col = hairColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(0.58,0.01))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(0.3,-0.1))) > 0.5)
) col = hairColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(0.95,0.04))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(0.63,-0.15))) > 0.5)
) col = hairColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(-0.615,0.25))) < 0.6)
&&(length(vec2(1,0.5)*(p-vec2(-0.43,0.15))) > 0.6)
) col = blackColor; // hairkage
if ((length(vec2(1,0.5)*(p-vec2(-0.6,0.25))) < 0.6)
&&(length(vec2(1,0.5)*(p-vec2(-0.43,0.15))) > 0.6)
) col = hairColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(-0.87,0.38))) < 0.26)
&&(length(vec2(1,0.5)*(p-vec2(-0.66,0.2))) > 0.26)
) col = blackColor; // hair
if ((length(vec2(1,0.5)*(p-vec2(-0.865,0.4))) < 0.265)
&&(length(vec2(1,0.5)*(p-vec2(-0.66,0.2))) > 0.25)
) col = hairColor; // hair
// kamikage
if ((length(vec2(1,0.5)*(p-vec2(-0.3,0.49))) < 0.3)
&&(length(vec2(1,0.5)*(p-vec2(-0.47,0.6))) > 0.41)
)col = hairColor2; // hairkage
if ((length(vec2(1,0.65)*(p-vec2(-0.92,0.525))) < 0.3)
&&(length(vec2(1,0.65)*(p-vec2(-1.05,0.63))) > 0.41)
)col = hairColor2; // hairkage
if ((length(vec2(1,0.65)*(p-vec2(0.32,0.525))) < 0.3)
&&(length(vec2(1,0.65)*(p-vec2(0.19,0.62))) > 0.41)
)col = hairColor2; // hairkage
if ((length(vec2(1,0.5)*(p-vec2(0.58,0.01))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(0.5,0.0))) > 0.5)
) col = hairColor2; // hairkage
if ((length(vec2(1,0.5)*(p-vec2(0.95,0.04))) < 0.5)
&&(length(vec2(1,0.5)*(p-vec2(0.85,-0.0))) > 0.5)
) col = hairColor2; // hairkage
}
void Mona(inout vec2 p, inout vec3 col)
{
if ((length(p-vec2(0.9,1.08)) < 0.88)&&(length(p-vec2(0.76,0.9)) < 0.75))col = whiteColor; // monanabase
if ((length(p-vec2(0.9,1.08)) < 0.88)&&(length(p-vec2(1.1,1.2)) > 1.0))col = whiteColor2;
if ((length(vec2(1,0.7)*(p-vec2(0.853,0.83))) < 0.083))col = RedColor;
if ((length(p-vec2(-0.4,0.0)) < 1.0)
&&(length(p-vec2(-0.3,-0.2)) > 1.2)
)col = RedColor;
float s = sin(sin(-4.0) * 0.75);
vec2 q = p * mat2(0, -s, s, 0);
if(abs(p.x-0.5+q.x) < 0.03 && abs(p.y-0.81) < 0.17)col = blackColor;
s = sin(sin(-2.7) * 0.75);
q = p * mat2(0, -s, s, 0);
if(abs(p.x-1.05+q.x) < 0.03 && abs(p.y-0.84) < 0.2)col = blackColor;
s = sin(sin(1.0) * 0.75);
float c = cos(sin(1.0 * 2.0));
q = p * mat2(c, -s, s, c);
if(abs(p.x-0.82+q.x) < 0.2 && abs(p.y-1.99 + q.y) < 0.05)col = blackColor;
s = sin(sin(-2.4) * 0.75);
q = p * mat2(0, -s, s, 0);
if(abs(p.x-1.67+q.x) < 0.03 && abs(p.y-1.02) < 0.1)col = blackColor;
}
vec3 snowflake(vec3 coords, vec2 pxPos) {
float focalPlane = 0.5 + 2.5 * 0.7;
float iris = 0.01;
float pxDiam = abs(coords.z - focalPlane) * iris;
vec2 flakePos = vec2(coords.xy) / coords.z;
float flakeDiam = 0.003 / coords.z;
float dist = length(pxPos - flakePos);
float bri = (pxDiam + flakeDiam - dist) / (pxDiam * 2.0);
if (pxDiam > flakeDiam) {
bri /= (pxDiam / flakeDiam);
}
return vec3(0.7, 0.9, 1.0) * min(1.0, max(0.0, bri));
}
vec2 EffectBass(inout vec2 p, inout vec3 c, int i)
{
c.z = fract(sin(float(i) * 25.643) * 735.5373);
c.z *= 0.2 + fract(sin(float(i) * 74.753) * 526.5463);
c.z = 0.5 + (1.0 - c.z) * 2.4;
float gSize = 0.5 / c.z;
vec2 drift = vec2(0);
drift.x = fract(sin(float(i) * 52.3464) * 353.43354) * 4.0;
drift.x = drift.x + time * 0.06 + 4.0 * sin(time * 0.03 + c.z * 7.0);
drift.y = fract(sin(float(i) * 63.2356) * 644.53463) * 4.0;
drift.y = drift.y + time * -0.2;
drift /= c.z;
vec2 grid = vec2(mod((p.x+drift.x)/c.z, gSize), mod((p.y-drift.y)/c.z, gSize));
c.x = gSize*0.5;
c.y = gSize*0.5;
return grid;
}
void MonaCoinChang(inout vec2 p, inout vec3 col)
{
col = vec3(0.75, 0.7, 0.7 );
for (int i=0; i<50; i++) {
vec3 c = vec3(0);
vec2 grid = EffectBass(p,c,i);
col += snowflake(c, grid);
}
float s = sin(sin(0.25))*0.9;
float c = cos(sin(0.25))*0.9;
p = p * mat2(c, -s, s, c);
p = vec2(p.x-0.1, p.y-0.05);
Face(p, col);
LeftEye(p, col);
RightEye(p, col);
Hair(p, col);
Mona(p, col);
for (int i=0; i<5; i++) {
vec3 c = vec3(0);
vec2 grid = EffectBass(p,c,i);
col += snowflake(c, grid);
}
}
vec3 filter(vec3 color) {
return color * 0.5 * (2.0 - gl_FragCoord.x / resolution.x + gl_FragCoord.y / resolution.y);
}
void main( void ) {
vec2 p = 2.0*( gl_FragCoord.xy / resolution.xy ) -1.0;
p.x *= resolution.x/resolution.y;
vec3 col;
MonaCoinChang(p, col);
gl_FragColor = vec4(filter(col), 1.0);
}