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.

88 lines
2.5 KiB
HTML

<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Electric hover effect</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/meyer-reset/2.0/reset.min.css">
<link rel="stylesheet" href="./style.css">
</head>
<body>
<!-- partial:index.partial.html -->
<a href="#" target="_blank">ENTER</a>
<script id="vertexShader" type="x-shader/x-vertex">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
uniform sampler2D _circle;
uniform sampler2D _circle_blur;
uniform sampler2D _dist;
uniform sampler2D _mask;
uniform sampler2D _color;
uniform float _time;
varying vec2 vUv;
//custom
uniform float _dispFactor;
uniform float _speed;
float map(float value, float minA, float maxA, float minB, float maxB){
return (value - minA) / (maxA - minA) * (maxB - minB) + minB;
}
void main() {
vec2 uv = vUv;
vec4 circleTexture = texture2D( _mask, uv );
vec2 scaleCenter = vec2(0.5, 0.5);
vec2 coord = uv;
float sin_factor = sin(0.72 * _time);
float cos_factor = cos(0.72 * _time);
coord = vec2(coord.x - 0.5, coord.y - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);
coord += 0.5;
vec2 distMapUV = uv * 0.22;
distMapUV.y -= _time / _speed;
vec4 mapColorDisp = texture2D( _color, (coord - scaleCenter) * 0.7 + scaleCenter );
vec4 mapDisp = texture2D( _dist, distMapUV);// - 0.75;
float xDisp = map( mapColorDisp.x, 0.0, 1.0, -1.0, 1.0 ) * mapDisp.x * _dispFactor;
float yDisp = map( mapColorDisp.y, 0.0, 1.0, -1.0, 1.0 ) * mapDisp.x * _dispFactor;
vec2 uvDisp = vec2(
clamp( xDisp * 0.3448 * circleTexture.a, -0.1, 0.1 ),
clamp( yDisp * 0.3448 * circleTexture.a, -0.1, 0.1 )
);
float maskCircle = circleTexture.a * 1.8;
vec2 scaledUV = vec2((uv - scaleCenter) * 1.5 + scaleCenter );
vec4 tex_light = texture2D( _circle, scaledUV + uvDisp * coord * 1.5);
vec4 tex_lightBlur = texture2D( _circle_blur, scaledUV + uvDisp * coord * 1.5);
tex_lightBlur.a *= (8.41 * circleTexture.a);
tex_lightBlur.rgb *= 2.2;
tex_light.rgb *= 1.6 * max((1.0 - maskCircle), .0);
gl_FragColor = mix(tex_light, tex_lightBlur, min(maskCircle, 1.0));
}
</script>
<!-- partial -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/86/three.min.js'></script>
<script src='./dat.gui.min.js'></script><script src="./script.js"></script>
</body>
</html>