canvas+webgl实现360度全景环境镜面反射不锈钢球体效果代码

代码语言:html

所属分类:三维

代码描述:canvas+webgl实现360度全景环境镜面反射不锈钢球体效果代码

代码标签: 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 time
#define S smoothstep
#define N normalize
#define rot(a) mat2(cos(a-vec4(0,11,33,0)))
float smin(float a, float b, float k) {
    float h = clamp(
      .5+.5*(b-a)/k,
      .0,
      1.
    );

    return mix(b, a, h)-k*h*(1.-h);
}

float dsc(vec2 e, float r) {
    return length(max(e,.0))+
        min(.0, max(e.x, e.y))-r;
}

float bod(vec3 p, float r) {
    const float s = -.00125,
    a = .7853981634;
    float d = -5e5;

    #define ct(ax) smin(d, length(q.ax)-r,s)
    vec3 q = p;
    q.xy *= rot(a);
    d = ct(yz);
    q.xy *= rot(-2.*a);
    d = ct(yz);

    q = p;

    q.yz *= rot(a);
    d = ct(xz);
    q.yz *= rot(-2.*a);
    d = ct(xz);

    q = p;

    q.xz *= rot(a);
    d = ct(xy);
    q.xz *= rot(-2.*a);
    d = ct(xy);

    return d;
}

float rods(vec3 p, vec2 s) {
    float a = .7853981634, rr=.025, d=5e5;
    vec3 st = abs(p);
    st.yz*= rot(a);
    d = min(d, dsc(vec2(length(st.xy),abs(st.z))-s,rr));
    st = abs(p);
    st.xz*= rot(a);
    d = min(d, dsc(vec2(length(st.xy),abs(st.z))-s,rr));
    st = abs(p);
    st.xy*= rot(a);
    d = min(d, dsc(vec2(length(st.xz),abs(st.y))-s,rr));

    return d;
}.........完整代码请登录后点击上方下载按钮下载查看

网友评论0