webgl+canvas实现三维透明玻璃体内部流动代码
代码语言:html
所属分类:三维
代码描述:webgl+canvas实现三维透明玻璃体内部流动代码
代码标签: webgl canvas 三维 透明 玻璃 体 内部 流动 代码
下面为部分代码预览,完整代码请点击下载或在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 > /********* * made by Matthias Hurrle (@atzedent) */ /** @type {HTMLCanvasElement} */ const canvas = window.canvas; const gl = canvas.getContext("webgl2"); const dpr = Math.max(1, 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 float time; uniform int pointerCount; uniform vec2 touch; #define T time #define S smoothstep #define mouse (touch/resolution) #define rot(a) mat2(cos(a),-sin(a),sin(a),cos(a)) float tick(float t, float e) { return floor(t)+pow(S(.0, 1., fract(t)), e); } float rnd(vec2 p) { return fract( sin( dot( p, vec2(12.9898, 78.233) ) )*43758.5453123 ); } float noise(vec2 p) { vec2 f=fract(p), i=floor(p); float a=rnd(i), b=rnd(i+vec2(1,0)), c=rnd(i+vec2(0,1)), d=rnd(i+vec2(1,1)); vec2 u = f*f*(3.-2.*f); return mix(a,b,u.x)+ (c-a)*u.y*(1.-u.x)+ (d-b)*u.y*u.x; } vec3 pattern(vec2 uv) { float t = T*.1; vec3 col = vec3(0); vec2 p = vec2(0); p.x = noise(uv+vec2(0,1)); p.y = noise(uv+vec2(1,0)); p = 8.*( vec2( sin(t), -cos(t) )*.15-p ); float s = .35; for(float i=.0;i<6.;i++) { p.x += s*sin(2.*t-i*1.5*p.y)+t; p.y += s*cos(2.*t+i*1.5*p.x)-t; } col+= sin(t+p.x+p.y); col = pow(S(vec3(0),vec3(1),col), vec3(.4)); col = mix(vec3(.7,.6,.4)*col, col, col); 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) { float d = 5e5, bx = box(p, vec3(9,1.5,.0625), .125); d = min(d, bx); return d; } vec3 norm(vec3 p) { vec2 e = vec2(1e-3, 0); float d = map(p); vec3 n = d-vec3( map(p-e.xyy), map(p-e.yxy), map(p-e.yyx) ); return normalize(n); } void cam(inout vec3 p) { if (pointerCount > 0) { p.yz*=rot(-mouse.y*acos(-1.)-acos(.0)); p.xz*=rot(mouse.x*acos(-1.)*2.); } else { p.xz*=rot(.5*sin(T*.25)); } } void main() { vec2 uv = ( gl_FragCoord.xy-.5*resolution ) / min(resolution.x, resolution.y); float zoom = pointerCount > 0 ? .0 : exp(-cos(T*.5))*.5; vec3 col = vec3(0), ro = vec3(0,0,zoom-4.), rd = normalize(vec3(uv, .7+zoom*.25)); cam(ro); cam(rd); vec3 p = ro, lp = -vec3(1,2,3); const float steps = 200., maxd = 40.; float dd = .0, at = .0, e = 1., side = 1.; for (float i = .0; i<steps; i++) { float d = map(p)*side; if (d < 1e-3) { vec3 n = norm(p)*side, l = normalize(ab.........完整代码请登录后点击上方下载按钮下载查看
网友评论0