2025年4月3日 星期四 乙巳(蛇)年 正月初四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Other

ffmpeg 给视频添加 火花特效

时间:11-24来源:作者:点击数:15

代码来源是 shadertoy ,主要想试验在 叠加在视频上的效果.

使用ffmpeg glsl shader 作用效果如下:

代码如下:

  • //Shader License: CC BY 3.0
  • //Author: Jan Mróz (jaszunio15)
  • #ifdef GL_ES
  • precision mediump float;
  • #endif
  • #define PI 3.1415927
  • #define TWO_PI 6.283185
  • #define ANIMATION_SPEED 1.5
  • #define MOVEMENT_SPEED 1.0
  • #define MOVEMENT_DIRECTION vec2(0.7, -1.0)
  • #define PARTICLE_SIZE 0.009
  • #define PARTICLE_SCALE (vec2(0.5, 1.6))
  • #define PARTICLE_SCALE_VAR (vec2(0.25, 0.2))
  • #define PARTICLE_BLOOM_SCALE (vec2(0.5, 0.8))
  • #define PARTICLE_BLOOM_SCALE_VAR (vec2(0.3, 0.1))
  • #define SPARK_COLOR vec3(1.0, 0.4, 0.05) * 1.5
  • #define BLOOM_COLOR vec3(1.0, 0.4, 0.05) * 0.8
  • #define SMOKE_COLOR vec3(1.0, 0.43, 0.1) * 0.8
  • #define SIZE_MOD 1.55
  • #define ALPHA_MOD 0.9
  • #define LAYERS_COUNT 15
  • uniform sampler2D texture;
  • uniform float u_time;
  • uniform vec2 u_resolution;
  • float hash1_2(in vec2 x)
  • {
  • return fract(sin(dot(x, vec2(52.127, 61.2871))) * 521.582);
  • }
  • vec2 hash2_2(in vec2 x)
  • {
  • return fract(sin(x * mat2(20.52, 24.1994, 70.291, 80.171)) * 492.194);
  • }
  • //Simple interpolated noise
  • vec2 noise2_2(vec2 uv)
  • {
  • //vec2 f = fract(uv);
  • vec2 f = smoothstep(0.0, 1.0, fract(uv));
  • vec2 uv00 = floor(uv);
  • vec2 uv01 = uv00 + vec2(0,1);
  • vec2 uv10 = uv00 + vec2(1,0);
  • vec2 uv11 = uv00 + 1.0;
  • vec2 v00 = hash2_2(uv00);
  • vec2 v01 = hash2_2(uv01);
  • vec2 v10 = hash2_2(uv10);
  • vec2 v11 = hash2_2(uv11);
  • vec2 v0 = mix(v00, v01, f.y);
  • vec2 v1 = mix(v10, v11, f.y);
  • vec2 v = mix(v0, v1, f.x);
  • return v;
  • }
  • //Simple interpolated noise
  • float noise1_2(in vec2 uv)
  • {
  • vec2 f = fract(uv);
  • //vec2 f = smoothstep(0.0, 1.0, fract(uv));
  • vec2 uv00 = floor(uv);
  • vec2 uv01 = uv00 + vec2(0,1);
  • vec2 uv10 = uv00 + vec2(1,0);
  • vec2 uv11 = uv00 + 1.0;
  • float v00 = hash1_2(uv00);
  • float v01 = hash1_2(uv01);
  • float v10 = hash1_2(uv10);
  • float v11 = hash1_2(uv11);
  • float v0 = mix(v00, v01, f.y);
  • float v1 = mix(v10, v11, f.y);
  • float v = mix(v0, v1, f.x);
  • return v;
  • }
  • float layeredNoise1_2(in vec2 uv, in float sizeMod, in float alphaMod, in int layers, in float animation)
  • {
  • float noise = 0.0;
  • float alpha = 1.0;
  • float size = 1.0;
  • vec2 offset;
  • //
  • for (int i = 0; i <6; i++)
  • {
  • offset += hash2_2(vec2(alpha, size)) * 10.0;
  • //Adding noise with movement
  • noise += noise1_2(uv * size + u_time * animation * 8.0 * MOVEMENT_DIRECTION * MOVEMENT_SPEED + offset) * alpha;
  • alpha *= alphaMod;
  • size *= sizeMod;
  • }
  • noise *= (1.0 - alphaMod)/(1.0 - pow(alphaMod, float(layers)));
  • return noise;
  • }
  • //Rotates point around 0,0
  • vec2 rotate(in vec2 point, in float deg)
  • {
  • float s = sin(deg);
  • float c = cos(deg);
  • return mat2(s, c, -c, s) * point;
  • }
  • //Cell center from point on the grid
  • vec2 voronoiPointFromRoot(in vec2 root, in float deg)
  • {
  • vec2 point = hash2_2(root) - 0.5;
  • float s = sin(deg);
  • float c = cos(deg);
  • point = mat2(s, c, -c, s) * point * 0.66;
  • point += root + 0.5;
  • return point;
  • }
  • //Voronoi cell point rotation degrees
  • float degFromRootUV(in vec2 uv)
  • {
  • return u_time * ANIMATION_SPEED * (hash1_2(uv) - 0.5) * 2.0;
  • }
  • vec2 randomAround2_2(in vec2 point, in vec2 range, in vec2 uv)
  • {
  • return point + (hash2_2(uv) - 0.5) * range;
  • }
  • vec3 fireParticles(in vec2 uv, in vec2 originalUV)
  • {
  • vec3 particles = vec3(0.0);
  • vec2 rootUV = floor(uv);
  • float deg = degFromRootUV(rootUV);
  • vec2 pointUV = voronoiPointFromRoot(rootUV, deg);
  • float dist = 2.0;
  • float distBloom = 0.0;
  • //UV manipulation for the faster particle movement
  • vec2 tempUV = uv + (noise2_2(uv * 2.0) - 0.5) * 0.1;
  • tempUV += -(noise2_2(uv * 3.0 + u_time) - 0.5) * 0.07;
  • //Sparks sdf
  • dist = length(rotate(tempUV - pointUV, 0.7) * randomAround2_2(PARTICLE_SCALE, PARTICLE_SCALE_VAR, rootUV));
  • //Bloom sdf
  • distBloom = length(rotate(tempUV - pointUV, 0.7) * randomAround2_2(PARTICLE_BLOOM_SCALE, PARTICLE_BLOOM_SCALE_VAR, rootUV));
  • //Add sparks
  • particles += (1.0 - smoothstep(PARTICLE_SIZE * 0.6, PARTICLE_SIZE * 3.0, dist)) * SPARK_COLOR;
  • //Add bloom
  • particles += pow((1.0 - smoothstep(0.0, PARTICLE_SIZE * 6.0, distBloom)) * 1.0, 3.0) * BLOOM_COLOR;
  • //Upper disappear curve randomization
  • float border = (hash1_2(rootUV) - 0.5) * 2.0;
  • float disappear = 1.0 - smoothstep(border, border + 0.5, originalUV.y);
  • //Lower appear curve randomization
  • border = (hash1_2(rootUV + 0.214) - 1.8) * 0.7;
  • float appear = smoothstep(border, border + 0.4, originalUV.y);
  • return particles * disappear * appear;
  • }
  • //Layering particles to imitate 3D view
  • vec3 layeredParticles(in vec2 uv, in float sizeMod, in float alphaMod, in int layers, in float smoke)
  • {
  • vec3 particles = vec3(0);
  • float size = 1.0;
  • float alpha = 1.0;
  • vec2 offset = vec2(0.0);
  • vec2 noiseOffset;
  • vec2 bokehUV;
  • for (int i = 0; i < LAYERS_COUNT; i++)
  • {
  • //Particle noise movement
  • noiseOffset = (noise2_2(uv * size * 2.0 + 0.5) - 0.5) * 0.15;
  • //UV with applied movement
  • bokehUV = (uv * size + u_time * MOVEMENT_DIRECTION * MOVEMENT_SPEED) + offset + noiseOffset;
  • //Adding particles if there is more smoke, remove smaller particles
  • particles += fireParticles(bokehUV, uv) * alpha * (1.0 - smoothstep(0.0, 1.0, smoke) * (float(i) / float(layers)));
  • //Moving uv origin to avoid generating the same particles
  • offset += hash2_2(vec2(alpha, alpha)) * 10.0;
  • alpha *= alphaMod;
  • size *= sizeMod;
  • }
  • return particles;
  • }
  • void main()
  • {
  • vec2 uv;
  • uv = gl_FragCoord.xy/u_resolution.xy;
  • gl_FragColor = texture2D(texture, uv);
  • uv=gl_FragCoord.xy/u_resolution.xy-.5;
  • float vignette = 1.0 - smoothstep(0.4, 1.4, length(uv + vec2(0.0, 0.3)));
  • uv *= 3.0;
  • float smokeIntensity = layeredNoise1_2(uv * 10.0 + u_time * 4.0 * MOVEMENT_DIRECTION * MOVEMENT_SPEED, 1.7, 0.7, 6, 0.2);
  • smokeIntensity *= pow(1.0 - smoothstep(-1.0, 1.6, uv.y), 2.0);
  • vec3 smoke = smokeIntensity * SMOKE_COLOR * 0.8 * vignette;
  • //Cutting holes in smoke
  • smoke *= pow(layeredNoise1_2(uv * 4.0 + u_time * 0.5 * MOVEMENT_DIRECTION * MOVEMENT_SPEED, 1.8, 0.5, 3, 0.2), 2.0) * 1.5;
  • vec3 particles = layeredParticles(uv, SIZE_MOD, ALPHA_MOD, LAYERS_COUNT, smokeIntensity);
  • vec3 col = particles + smoke + SMOKE_COLOR * 0.02;
  • col *= vignette;
  • col = smoothstep(-0.08, 1.0, col);
  • gl_FragColor += vec4(col, 1.0);
  • }
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐