canvas实现webgl三维多面玻璃晶体穿梭飞行动画效果代码
代码语言:html
所属分类:三维
代码描述:canvas实现webgl三维多面玻璃晶体穿梭飞行动画效果代码
代码标签: canvas webgl 三维 多面 玻璃 晶体 穿梭 飞行 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> * { box-sizing: border-box; } html, body { margin: 0; min-height: 100vh; overflow: hidden; background: repeating-radial-gradient( circle at center, #444 0 10%, #111 10% 20% ); touch-action: none; } canvas { width: 100%; height: auto; object-fit: contain; } </style> </head> <body> <canvas id="canvas"></canvas> <script > const canvas = window.canvas; const gl = canvas.getContext("webgl2"); const dpr = Math.max(1, .5 * window.devicePixelRatio); /** @type {Map<string,PointerEvent>} */ const touches = new Map(); const vertexSource = `#version 300 es #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif in vec2 position; void main(void) { gl_Position = vec4(position, 0., 1.); } `; const fragmentSource = `#version 300 es /********* * made by Matthias Hurrle (@atzedent) */ #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif out vec4 fragColor; uniform vec2 resolution; uniform vec2 touch; uniform float time; uniform int pointerCount; #define mouse (touch/resolution) #define TAU 6.2831853 #define ESN 1.5707963 #define PI 3.141592 #define N .3 #define T time #define S smoothstep #define P pointerCount #define doubleplane(p,o,n) max(dot(p-o,n),dot(-p-o,n)) const float PHI = (.5 + .5 * sqrt(5.)); const float INV_PHI = PHI - 1.; const vec3 tint = vec3(.85, .9, 1); mat2 rot(float a) { float s = sin(a), c = cos(a); return mat2(c, -s, s, c); } vec3 pattern(vec2 p, float t) { float a = ESN, proc = pow(S(.0, 1., -cos(t*.25)*.5+.5), 8.), anim = -cos(ESN+t*.125)*.5+.5, scene = S(.0, 1., anim); p = mod(vec2(log(length(p)) - t, atan(p.y, p.x) / TAU * 6.), 1.) - .5; p *= rot(floor(atan(p.y, p.x) / a + .5) * a); p = p.y < .0 ? -p: p; a = abs(p.x + p.y - N); a = a > N ? abs(p.x - p.y + N): a; vec3 col = mix(vec3(1. - exp(-a * 9.)), tint, .25), glo = mix(mix(vec3(3,1,2), vec3(1,2,3), scene), tint*.1, pow(col, vec3(.4545))); return mix(col, glo, proc); } float icosa(vec3 p, float s) { float n = 1. / sqrt(3.); vec3 a = n * vec3(1, 1, 1), b = n * vec3(-1, 1, 1), c = n * vec3(-1, 1, -1), d = n * vec3(1, 1, -1), e = n * vec3(0, INV_PHI, PHI), f = n * vec3(0, INV_PHI, -PHI); float dist = doubleplane(p, s * a, a); dist = max(doubleplane(p, s * b, b), dist); dist = max(doubleplane(p, s * c, c), dist); dist = max(doubleplane(p, s * d, d), dist); dist = max(doubleplane(p, s * e, e), dist); dist = max(doubleplane(p, s * f, f), dist); dist = max(doubleplane(p, s * e.zxy, e.zxy), dist); dist = max(doubleplane(p, s * e.yzx, e.yzx), dist); dist = max(doubleplane(p, s * f.zxy, f.zxy), dist); dist = max(doubleplane(p, s * f.yzx, f.yzx), dist); return dist; } vec2 map(vec3 p) { vec3 q = p; q.yz *= rot(T); q.xz *= rot(-T); vec2 a = vec2(length(p - vec3(0, -1010, 0)) - 1008., 0), b = vec2(icosa(q, .75), 1); a = a.x < b.x ? a: b; return a; } vec3 norm(vec3 p) { vec2 e = vec2(45e-3, 0); float d = map(p).x; vec3 n = d - vec3( map(p - e.xyy).x, map(p - e.yxy).x, map(p - e.yyx).x ); return normalize(n); } void cam(inout vec3 p) { if (P > 0) { p.yz *= rot(-clamp(mouse.y, -.5, .65) * PI + ESN); p.xz *= rot(PI - mouse.x * TAU); } else { p.xy *= rot(TAU * exp(cos(T * .05))); p.yz *= rot(ESN - .9 + exp(-cos(-T * .2)) * .15); } } void mai.........完整代码请登录后点击上方下载按钮下载查看
网友评论0