webgl+canvas实现炫酷柔和多彩背景动画效果代码
代码语言:html
所属分类:动画
代码描述:webgl+canvas实现炫酷柔和多彩背景动画效果代码
代码标签: webgl canvas 炫酷 柔和 多彩 背景 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> * { margin: 0; padding: 0; } body { height: 100vh; width: 100%; display: grid; place-items: stretch; } #gradient-canvas { height: 100vh; width: 100%; background: lightgrey; } </style> </head> <body> <!-- partial:index.partial.html --> <canvas style="--gradient-color-1:#ef008f;--gradient-color-2:#6ec3f4;--gradient-color-3:#7038ff;--gradient-color-4:#e2e2e2;" id="gradient-canvas" data-transition-in></canvas> <script> window.addEventListener('DOMContentLoaded', (e) => { var gradient = new Gradient; gradient.initGradient("#gradient-canvas"); }); </script> <!-- partial --> <script> // https://kevinhufnagl.com/wp-content/themes/lightisol/dist/js/min/lightisol-gradient.min.js?ver=1.0 // function normalizeColor(hexCode) { return [ ((hexCode >> 16) & 255) / 255, ((hexCode >> 8) & 255) / 255, (255 & hexCode) / 255 ]; } ["SCREEN", "LINEAR_LIGHT"].reduce( (hexCode, t, n) => Object.assign(hexCode, { [t]: n }), {} ); class MiniGl { constructor(canvas, width, height, debug = !1) { const _miniGl = this, debug_output = -1 !== document.location.search.toLowerCase().indexOf("debug=webgl"); (_miniGl.canvas = canvas), (_miniGl.gl = _miniGl.canvas.getContext("webgl", { antialias: !0 })), (_miniGl.meshes = []); const context = _miniGl.gl; width && height && this.setSize(width, height), _miniGl.lastDebugMsg, (_miniGl.debug = debug && debug_output ? function (e) { const t = new Date(); t - _miniGl.lastDebugMsg > 1e3 && console.log("---"), console.log( t.toLocaleTimeString() + Array(Math.max(0, 32 - e.length)).join(" ") + e + ": ", ...Array.from(arguments).slice(1) ), (_miniGl.lastDebugMsg = t); } : () => {}), Object.defineProperties(_miniGl, { Material: { enumerable: !1, value: class { constructor(vertexShaders, fragments, uniforms = {}) { const material = this; function getShaderByType(type, source) { const shader = context.createShader(type); return ( context.shaderSource(shader, source), context.compileShader(shader), context.getShaderParameter(shader, context.COMPILE_STATUS) || console.error(context.getShaderInfoLog(shader)), _miniGl.debug("Material.compileShaderSource", { source: source }), shader ); } function getUniformVariableDeclarations(uniforms, type) { return Object.entries(uniforms) .map(([uniform, value]) => value.getDeclaration(uniform, type)) .join("\n"); } (this.uniforms = uniforms), (this.uniformInstances = []); const prefix = "\n precision highp float;\n "; (this.vertexSource = `\n ${prefix}\n attribute vec4 position;\n attribute vec2 uv;\n attribute vec2 uvNorm;\n ${getUniformVariableDeclarations( _miniGl.commonUniforms, "vertex" )}\n ${getUniformVariableDeclarations( uniforms, "vertex" )}\n ${vertexShaders}\n `), (this.Source = `\n ${prefix}\n ${getUniformVariableDeclarations( _miniGl.commonUniforms, "fragment" )}\n ${getUniformVariableDeclarations( uniforms, "fragment" )}\n ${fragments}\n `), (this.vertexShader = getShaderByType( context.VERTEX_SHADER, this.vertexSource )), (this.fragmentShader = getShaderByType( context.FRAGMENT_SHADER, this.Source )), (this.program = context.createProgram()), context.attachShader(this.program, this.vertexShader), context.attachShader(this.program, this.fragmentShader), context.linkProgram(this.program), context.getProgramParameter(this.program, context.LINK_STATUS) || console.error(context.getProgramInfoLog(this.program)), context.useProgram(this.program), this.attachUniforms(void 0, _miniGl.commonUniforms), this.attachUniforms(void 0, this.uniforms); } attachUniforms(name, uniforms) { const material = this; void 0 === name ? Object.entries(uniforms).forEach(([name, uniform]) => { material.attachUniforms(name, uniform); }) : "array" == uniforms.type ? uniforms.value.forEach((uniform, i) => material.attachUniforms(`${name}[${i}]`, uniform) ) : "struct" == uniforms.type ? Object.entries(uniforms.value).forEach(([uniform, i]) => material.attachUniforms(`${name}.${uniform}`, i) ) : (_miniGl.debug("Material.attachUniforms", { name: name, uniform: uniforms }), material.uniformInstances.push({ uniform: uniforms, location: context.getUniformLocation(material.program, name) })); } } }, Uniform: { enumerable: !1, value: class { constructor(e) { (this.type = "float"), Object.assign(this, e), (this.typeFn = { float: &q.........完整代码请登录后点击上方下载按钮下载查看
网友评论0