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