webgl+canvas实现三维小宇宙眼球拖拽旋转效果代码
代码语言:html
所属分类:三维
代码描述:webgl+canvas实现三维小宇宙眼球拖拽旋转效果代码
代码标签: webgl canvas 三维 小宇宙 眼球 拖拽 旋转
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> </head> <body> <script > const canvas = document.createElement("canvas"); const gl = canvas.getContext("webgl2"); document.title = "🤖"; document.body.innerHTML = ""; document.body.appendChild(canvas); document.body.style = "margin:0;touch-action:none;overflow:hidden;"; canvas.style.width = "100%"; canvas.style.height = "auto"; canvas.style.userSelect = "none"; const dpr = window.devicePixelRatio; function resize() { const { innerWidth: width, innerHeight: height } = window; canvas.width = width * dpr; canvas.height = height * dpr; gl.viewport(0, 0, width * dpr, height * dpr); } window.onresize = resize; const vertexSource = `#version 300 es #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif in vec4 position; void main(void) { gl_Position = position; } `; const fragmentSource = `#version 300 es #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif out vec4 fragColor; uniform vec2 resolution; uniform float time; uniform vec2 touch; uniform int pointerCount; #define mouse (touch/resolution) #define P pointerCount #define T time #define S smoothstep #define syl(p,s) (length(p)-s) mat2 rot(float a) { float c = cos(a), s = sin(a); return mat2(c, -s, s, c); } float disc(vec3 p, vec2 s, float r) { vec2 e = vec2(length(abs(p.xz)), abs(p.y)) - s; return length(max(e, .0)) + min(.0, max(e.x, e.y)) - r; } vec2 map(vec3 p) { vec2 a = vec2(-disc(p-vec3(0,49,0), vec2(50), 5.), 0), b = vec2(syl(p, 1.), 1); a = a.x < b.x ? a : b; return a; } vec3 tunnel(vec2 uv, float t) { float tt = t; vec2 p = uv; t = t*.25-cos(t*.5)*1.5; p *= rot(t); vec3 col = vec3(0); const vec3 tint = vec3(2,2.5,3); p = normalize(p)*log(length(p)*.8); p = vec2(atan(p.y, p.x), length(p)*.5+T*.5); vec3 z = vec3(p*.5, 0); float c = sin(t*.2)*.25+.75, d = .0, k = .5, f = mix(.95, 1.,fract(sin(dot(z, z)+tt)*345678.)); for (int i = 0; i < 3; i++) { z.z += d*(.85-c*.35)*f; vec3 a = z/k; d += mix( abs(.7*dot(sin(a*2.), cos((a*2.).yzx))*.5), abs(f*k*dot(sin(a), cos(a.yzx))), c ); k *= .25; } d = 1.-clamp(d*1.2,.0, 1.)*1.2; col += d*S(2.,.0, dot(uv, uv)*1.2)*tint*.5; return max(col, .0); } vec3 norm(vec3 p) { vec2 e = vec2(1e-3, 0); float d = map(p).x; return normalize(d-vec3( map(p-e.xyy).x, map(p-e.yxy).x, map(p-e.yyx).x )); } void cam(inout vec3 p) { if (P>0) { p.yz *= rot(-mouse.y*acos(-1.)+acos(.0)); p.xz *= rot(acos(-1.)-mouse.x*acos(-1.)*2.); } else { p.yz *= rot(-.125); p.xz *= rot(.125); } } void main(void) { vec2 uv = ( gl_FragCoord.xy-.5*resolution ) / min(resoluti.........完整代码请登录后点击上方下载按钮下载查看
网友评论0