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