Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】
时间:2022-07-23
本文章向大家介绍Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
再炫的特效没有声音也是不完整的~
效果图
该特效可以分为以下 5 种效果的融合。
大 Blob 的效果
结合代码可知,这其实就是二维 sin*cos 的效果。
对纹理坐标增加了点随机性并随着 progress 移动后的效果如下
相应代码和注释如下
/// @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));
小粒子的效果
相应代码和注释如下
/// @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 的变化
从上图中可以看出该效果是 “从无到有再到无” 的一个过程。
相应代码和注释如下
/// @note 颜色随着 progress 而变化
f = pow3(f * color, ///< 着色
vec3(1., 2. - sin(progress * PI), 1.3)); ///< 1., [2., 1.], 1.3
f *= sin(progress * PI);
纹理坐标的周期性缩放
纹理坐标的缩放即是对纹理进行缩放的效果
相应代码和注释如下
/// @note 图像周期性缩放
p -= .5; ///< 以屏幕中心为原点
/// 随机对纹理坐标进行缩放
p *= 1. + (smoothRandom(vec2(progress * 5.), 6.3) * sin(progress * PI) * .05);
p += .5; ///< 平移原点回左下角
带噪点的转场(结合纹理的缩放)
相应代码和注释如下
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; ///< 平均,模糊
/// @brief 纹理平滑混合
vec4 textureSmoothMix(vec2 p)
{
return mix(getFromColor(p), getToColor(p), sigmoid(progress, 10.));
}
综上
综合以上所有效果后,完整代码和解释如下
请留言
- Java基础-18(01)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
- 一个oracle查询引起的bug (r4笔记第59天)
- Java基础-18(02)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
- 特殊的物化视图刷新 (r4笔记第77天)
- 通过单例模式模拟RAC连接 (r4笔记第76天)
- 网站上的验证码是怎么产生的?
- Java基础-17(01)总结,登录注册案例,Set集合,HashSet
- mongoDB初探第一篇(r4笔记第75天)
- 重温快速排序(r4笔记第73天)
- Java基础-17(01)总结,TreeSet,LinkHashSet
- 海量数据迁移之数据抽取流程 (r4笔记第72天)
- CSS Selectors Level 4新特性全面解析
- 巧用外部表避免大量的insert (r4笔记第71天)
- 如何用java语言实现C#中的ref关键字(按引用传递参数)的效果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】七、Android FFmpeg 视频编码
- 2020已经过去五分之四了,你确定还不来了解一下JS的rAF?
- c#任意进制转换
- 缺失值的处理方法(基于sklearn)
- 中国核酸数据库GSA数据提交指南
- 基于sklearn建立机器学习的pipeline
- Sentinle集群流控【源码笔记】
- ggplot坐标轴方向设置
- Scaling与Normalization的区别
- Android 音乐APP(一)扫描本地音乐
- Semaphore:如何快速实现一个限流器?
- 延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
- Android 音乐APP(二)启动白屏优化、定位当前播放歌曲
- CompletableFuture:异步编程没那么难
- 你知道Oracle数据库除了SGA和PGA,还有MGA么?