形状特效
初次接触到形状特效是在剪映,剪映中叫蒙版,就是列举了一些常见形状的蒙层效果,除了常规的旋转、缩放、位移等操作外,还有个虚化的效果。可以去剪映感受下。
接触到这东西,觉得效果挺不错,打算研究下,正好手头的编辑工具项目也可以用上。线性、圆形、矩形,这几个规范的,通过平方根公式 跟 三角形余弦定理基本都可以推算出来(可以参考github shader),重点来了,爱心 & 五角星 怎么搞?
特殊形状
爱心 、五角星,一开始觉得可能是通过 三角函数、关键点、贝塞尔曲线 等数学计算实现的? 想想觉得这样是不是过于复杂, 一翻google之后,还是没啥思路。放大招抓包,剪映的素材都是下发的,必然会有网络请求的,一顿操作之后,如愿拿到了资源包。
爱心
五角星
看到了这两个,很明显不是通过复杂数学计算得到的。 但是这一层一层的渐变红绿图 是什么鬼?
资源包里还有shader文件的😄
float alpha = (col.r * 4.0 * 256.0 + col.g * 255.0) / 781.0;
重点的就是这行计算逻辑,还是懵的。
col.r
col.g
对应图上的红绿分量可以理解*4 /781
是什么鬼? 4 对应 图上的四层?
用颜色取色器取色看看,这一看就明白了。
1 | 第1层c00d00 |
每层红色分量固定(00/40/80/c0),绿色分量渐变0到255(00-ff),所以整个图层解析下来就是 从0 到 781.
alpha 计算下来就有 256 *3 + 1 = 769 个值,最里面的一层最小的,固定为1,保障无虚化的时候也有最基本的形状效果。
搞明白之后,顿时觉得秒啊, 回头一想,为什么要搞的那么多复杂呢? 反正是为了计算alpha,直接搞个灰度图 从黑到白,不就好了?
仔细一想,灰度图一个分量最多256个,最终的效果割裂感会很明显,所以用到了r、g 两个分量,让效果更丝滑,实际上如果你想 也可以用rbg三个分量,重新设计下计算公式 让范围更大更丝滑。
举一反三
学以致用,那必须举一反三下了。
花型
用五角星图去找设计师,参考一下做一个花型的。设计师也一下没掌握精髓,照着搞了一个但不是我想要的。所以有了人生第一次指导设计师画图了,一翻操作之后 搞定了
最后的shader
1 | #iUniform float iReverse = 0. |
完整效果