前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】

Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】

原创
作者头像
ShaderJoy
修改2020-08-17 10:17:26
2.7K0
修改2020-08-17 10:17:26
举报
文章被收录于专栏:ShaderJoyShaderJoy

再炫的特效没有声音也是不完整的~

Shader 特效 —— Film Burn.mp4

效果图

该特效可以分为以下 5 种效果的融合。

?大 Blob 的效果

没添加随机性的大 Blob 示意图
没添加随机性的大 Blob 示意图

结合代码可知,这其实就是二维?sin*cos 的效果。

sin(x)cos(y)
sin(x)cos(y)

对纹理坐标增加了点随机性并随着 progress 移动后的效果如下

增加了随机性的大 Blob 动态示意图【gif 对颜色进行了量化】
增加了随机性的大 Blob 动态示意图【gif 对颜色进行了量化】
增加了随机性的大 Blob 静态示意图
增加了随机性的大 Blob 静态示意图

相应代码和注释如下

代码语言:javascript
复制
/// @note 大 Blob
/// 增加一点随机性,改变每个 blob 的形状
        f += .1 +
             sin(((p.x * rand(i) * 6.0) + ///< 影响 blob 的大小
                  (progress * 8.0)) +     ///< 影响 blob 的速度
                 rand(i + 1.43)) *
             cos(((p.y * rand(i + 4.4) * 6.0) + ///< 影响 blob 的大小
                  (progress * 6.0)) +           ///< 影响 blob 的速度
                 rand(i + 2.4));    
                 

小粒子的效果

相应代码和注释如下

代码语言:javascript
复制
/// @note 小粒子
        f += 1. - clamps(length(p -
                                vec2(smoothRandom(vec2(progress * 1.3), i + 1.0),       ///< 控制粒子的运动位置和轨迹【通过插值确保产生的随机值是连续的】
                                     smoothRandom(vec2(progress * 0.5), i + 6.25))) *
                         mix(20., 70., rand(i)));                                       ///< 影响粒子的大小,值越大粒子越小

其实就是在随机的位置【连续变化】画随机大小的圆。?

大 Blob & 小粒子 随着 Progress 的变化

f 随着 progress 的变化
f 随着 progress 的变化

从上图中可以看出该效果是 “从无到有再到无” 的一个过程。

动态效果【gif 对颜色进行了量化】
动态效果【gif 对颜色进行了量化】
静态效果
静态效果

相应代码和注释如下

代码语言:javascript
复制
/// @note 颜色随着 progress 而变化
f = pow3(f * color,   ///< 着色
         vec3(1., 2. - sin(progress * PI), 1.3)); ///< 1., [2., 1.], 1.3
f *= sin(progress * PI);

纹理坐标的周期性缩放

这里对纹理坐标的值进行了调整以便显示
这里对纹理坐标的值进行了调整以便显示

纹理坐标的缩放即是对纹理进行缩放的效果

相应代码和注释如下

代码语言:javascript
复制
/// @note 图像周期性缩放
p -= .5;    ///< 以屏幕中心为原点
 
/// 随机对纹理坐标进行缩放
p *= 1. + (smoothRandom(vec2(progress * 5.), 6.3) * sin(progress * PI) * .05);
p += .5;    ///< 平移原点回左下角

带噪点的转场(结合纹理的缩放)

相应代码和注释如下

代码语言:javascript
复制
    float bluramount = sin(progress * PI) * .03;
 
    /// @note repeats 越大,毛玻璃效果越弱
    for (float i = 0.; i < repeats; i++)
    {
        /// 角度转弧度
        float rad = radians((i / repeats) * 360.);
        vec2 q = vec2(cos(rad), sin(rad)) *
                 (rand(vec2(i, p.x + p.y)) + bluramount); ///< 生成噪点
 
        vec2 uv2 = p + (q * bluramount); ///< 随机噪点偏移纹理坐标,毛玻璃效果
        blurred_image += textureSmoothMix(uv2); ///< 叠加随机偏移的纹理(同时随着 progress 变化)
    }
    blurred_image /= repeats; ///< 平均,模糊
代码语言:javascript
复制
/// @brief 纹理平滑混合
vec4 textureSmoothMix(vec2 p)
{
    return mix(getFromColor(p), getToColor(p), sigmoid(progress, 10.));
}
sigmoid 示意图
sigmoid 示意图

综上

综合以上所有效果后,完整代码和解释如下

代码语言:javascript
复制
请留言

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 再炫的特效没有声音也是不完整的~
  • 效果图
    • ?大 Blob 的效果
      • 小粒子的效果
        • 大 Blob & 小粒子 随着 Progress 的变化
          • 纹理坐标的周期性缩放
            • 带噪点的转场(结合纹理的缩放)
            • 综上
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
            http://www.vxiaotou.com