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