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