canvas+webgl实现360度全景环境可旋转蠕动的液态立方体交互效果代码

代码语言:html

所属分类:三维

代码描述:canvas+webgl实现360度全景环境可旋转蠕动的液态立方体交互效果代码,原生js实现。

代码标签: canvas webgl 360度 全景 环境 旋转 蠕动 液态 立方体 交互

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  

</head>

<body translate="no">
  
  
      <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 = Math.max(1, 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;

function createCubeMap() {
  const cubeMap = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, cubeMap);

  const imgpath = '//repo.bfw.wiki/bfwrepo/images/360';
  const faces = [
  [gl.TEXTURE_CUBE_MAP_POSITIVE_X, 'posx.jpg'],
  [gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 'negx.jpg'],
  [gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 'posy.jpg'],
  [gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 'negy.jpg'],
  [gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 'posz.jpg'],
  [gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 'negz.jpg']];


  for (let [target, url] of faces) {
    const level = 0;
    const internalFormat = gl.RGBA;
    const width = 512;
    const height = 512;
    const format = gl.RGBA;
    const type = gl.UNSIGNED_BYTE;
    gl.texImage2D(target, level, internalFormat, width, height, 0, format, type, null);
    const image = new Image();
    image.crossOrigin = 'anonymous';
    image.onload = () => {
      gl.bindTexture(gl.TEXTURE_CUBE_MAP, cubeMap);
      gl.texImage2D(target, level, internalFormat, format, type, image);
    };
    image.src = `${imgpath}/${url}?width=512&height=512&format=auto`;
  }
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
}
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 O;
uniform vec2 resolution;
uniform float time;
uniform vec2 touch;
uniform samplerCube cubeMap;
#define mouse (touch/R)
#define FC gl_FragCoord.xy
#define R resolution
#define T mod(time,120.)
#define S smoothstep
#define N normalize
#define rot(a) mat2(cos(a-vec4(0,11,33,0)))
float map(vec3 p) {
    float t=T*5.;
    t=mix(t,t+.5,sin(t)*.5+.5);
    p.z*=1.-.05*cos((sign(p.z)<.0?1.:-1.)*t-14.*length(p));
    p.x*=1.-.05*cos(t-14.*p.z);
    p.y*=1.-.05*cos(t-14.*p.z);
    p=abs(p)-1.;
    float d=length(max(p,.0))+min(.0,max(max(p.x,p.y),p.z))-.05;
    return d*.5;
}
vec3 norm(vec3 p) {
    float h=1e-3;
    vec2 k=vec2(-1,1);
    return N(
        k.xyy*map(p+k.xyy*h)+
        k.yxy*map(p+k.yxy*h)+
        k.yyx*map(p+k.yyx*h)+
        k.xxx*map(p+k.xxx*h)
    );
}
float mapto(float x,float a,float b,float c,float d) { return (x-a)/(b-a)*(d-c)+c; }
void cam(inout vec3 p) {
    if (abs(mapto(.........完整代码请登录后点击上方下载按钮下载查看

网友评论0