canvas+webgl实现多彩粒子烟花绽放动画效果代码
代码语言:html
所属分类:粒子
代码描述:canvas+webgl实现多彩粒子烟花绽放动画效果代码
代码标签: canvas webgl 多彩 粒子 烟花 绽放 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html> <head> <style> canvas{position:absolute;top:0;left:0;background-color:#111;} </style> </head> <body> <canvas id=c></canvas> <script> var gl =c.getContext('webgl',{preserveDrawingBuffer:true }),w =c.width =window.innerWidth,h =c.height =window.innerHeight ,webgl ={},opts ={projectileAlpha:.8,projectileLineWidth:1.3,fireworkAngleSpan:.5,baseFireworkVel:3,addedFireworkVel:3,gravity:.03,lowVelBoundary:-.2,xFriction:.995,baseShardVel:1,addedShardVel:.2,fireworks:1000,baseShardsParFirework:10,addedShardsParFirework:10,shardFireworkVelMultiplier:.3,initHueMultiplier:1 / 360,runHueAdder:.1 / 360 } webgl.vertexShaderSource =` uniform int u_mode;uniform vec2 u_res;attribute vec4 a_data;varying vec4 v_color;vec3 h2rgb(float h ){return clamp(abs(mod(h *6. + vec3(0,4,2 ),6. ) - 3. ) -1.,0.,1. );} void clear(){gl_Position =vec4(a_data.xy,0,1 );v_color =vec4(0,0,0,a_data.w );} void draw(){gl_Position =vec4(vec2(1,-1 ) *((a_data.xy / u_res ) *2. - 1. ),0,1 );v_color =vec4(h2rgb(a_data.z ),a_data.w );} void main(){if(u_mode ==0 ) draw();else clear();} `;webgl.fragmentShaderSource =` precision mediump float;varying vec4 v_color;void main(){gl_FragColor =v_color;} `; webgl.vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(webgl.vertexShader, webgl.vertexShaderSource); gl.compileShader(webgl.vertexShader); webgl.fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(webgl.fragmentShader, webgl.fragmentShaderSource); gl.compileShader(webgl.fragmentShader); webgl.shaderProgram = gl.createProgram(); gl.attachShader(webgl.shaderProgram, webgl.vertexShader); gl.attachShader(webgl.shaderProgram, webgl.fragmentShader); gl.linkProgram(webgl.shaderProgram); gl.useProgram(webgl.shaderProgram); webgl.dataAttribLoc = gl.getAttribLocation(webgl.shaderProgram, 'a_data'); webgl.dataBuffer = gl.createBuffer(); gl.enableVertexAttribArray(webgl.dataAttribLoc); gl.bindBuffer(gl.ARRAY_BUFFER, webgl.dataBuffer); gl.vertexAttribPointer(webgl.dataAttribLoc, 4, gl.FLOAT, false, 0, 0); webgl.resUniformLoc = gl.getUniformLocation(webgl.shaderProgram, 'u_res'); webgl.modeUniformLoc = gl.getUniformLocation(webgl.shaderProgram, 'u_mode'); gl.viewport(0, 0, w, h); gl.uniform2f(webgl.resUniformLoc, w, h); gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); gl.enable(gl.BLEND); gl.lineWidth(opts.projectileLineWidth); webgl.data = []; webgl.clear = function() { gl.uniform1i(webgl.modeUniformLoc, 1); var a = .1; webgl.data = [-1, -1, 0, a, 1, -1, 0, a, -1, 1, 0, a, -1, 1, 0, a, 1, -1, 0, a, 1, 1, 0, a]; webgl.draw(gl.TRIANGLES); gl.uniform1i(webgl.modeUniformLoc, 0); webgl.data.length = 0; } webgl.draw = function(glType) { gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(webgl.data), gl.STATIC_DRAW); gl.drawArrays(glType, 0, webgl.data.length / 4); } var fireworks = [], tick = 0, sins = [], coss = [], maxShardsParFirework = opts.baseShardsParFirework + opts.addedShardsParFirework, tau = 6.283185307179586476925286766559; for (var i = 0; i < maxShardsParFirework; ++i) { sins[i] = Math.sin(tau * i / maxShardsParFirework); coss[i] = Math.cos(tau * i / maxShardsParFirework); } function Firework() { this.reset(); this.shards = []; for (var i = 0; i < maxShar.........完整代码请登录后点击上方下载按钮下载查看
网友评论0