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.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 /********* * 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 float time; uniform int pointerCount; uniform vec2 touch; #define P pointerCount #define mouse (touch/resolution) #define T time #define S smoothstep mat2 rot(float a) { float s = sin(a), c = cos(a); return mat2(c, -s, s, c); } vec3 pattern(vec2 uv) { vec3 col = vec3(0); uv *= 600.; const float steps = 20.; for (float i = .0; i < steps; i++) { uv.y -= i*1e-3 * uv.x; uv.x += i *1.2 * sin(uv.x*.09)*cos(uv.y*.05+T*2.5); float t = 63.*i/steps+T*.1, x = cos(t), y = sin(t*.1); vec2 p = 1e2*vec2(x, y)/sin(3.15*sin(uv.x*.05+T*.1)); col += i/length(uv-p)*(cos(vec3(0, 3, -3)+i*.63)*.5+.5); } col = pow(col, vec3(1.2)); return col; } float box(vec3 p, vec3 s, float r) { p = abs(p)-s; return length(max(p,.0))+ min(.0, max(max(p.x, p.y), p.z))-r; } float map(vec3 p) { p.xy *= rot(6.3*sin(p.z*.05)); return -box(p, vec3(1, 1, 20), .05); } vec3 norm(vec3 p) { vec2 e = vec2(1e-3, 0); float d = map(p); return normalize( d-vec3( map(p-e.xyy), map(p-e.yxy), map(p-e.yyx) ) ); } void cam(inout vec3 p) { if (P>0) { p.yz *= rot(-mouse.y+.5); p.xz *= rot(.25-mouse.x*.5); } else { p.yz *= rot(sin(T*.1)*.2); p.xz *= rot(sin(.2*sin(p.y*.025+T))*.06*p.x); } } void main(void) { vec2 uv = ( gl_FragCoord.xy -.5 * resolution ) / min(resolution.x, resolution.y); vec3 col = vec3(0), rd = normalize(vec3(uv, 1)), p = vec3(0, 0, -2); cam(p); cam(rd); .........完整代码请登录后点击上方下载按钮下载查看
网友评论0