如图,这种地图上经常出现的地标特效,我们用shader做一个,记录一下源码。这种特效有以下几个特征:

  • 分为上下2个sprite:上面的半透明图标和下面的同心圆环。

  • 特效发光发热。

  • 特效不参与光照、没有碰撞属性、没有阴影。

  • 上面图标以弦函数的速率上下运动,这样看上去有惯性。

  • 上面图标运动到最低位置时,下面最小的圆环刚刚生成,还是一个圆点,这样看上去好像是上面图标触发了下面圆环的生成,更加带感、拟物。

  • 上面图标永远对准相机,下面同心圆不动。

  • 上面图标(为了对准相机而运动)的支点(pivot point,或者叫中心点、枢点)在sprite的正下方。

  • 下面同心圆从两侧均可看见(禁用三角朝向剔除)。

关于什么是sprite(二维小精灵),可以参考《静态特效组成原理》《雷达图生成算法》

  • circle材质:下方的同心圆动画材质

  • plane网格体:下面同心圆的载体

  • icon纹理:上方的图标

  • mark材质:上面的动画材质

  • landmark蓝图类:成品

之所以选择UE4,是因为UE4提供了现成的编辑器,可以方便地编辑预览shader代码。首先我们landmark蓝图类继承自actor,其中有2个组件:MaterialBillboard和plane,很显然分别是特效上下2个部分。至于plane有没有更好的sprite选择,尚不知道,目前只能用一个静态网格体来做。

对于上方的billboard,我们做以下设置:主要关联一下材质资产,并且设置尺寸。这里Base Size即方形的边长的一半,要和动画中的世界位置偏移保持一致,这样才能模拟正下方的pivot point。

然后图标的化我们准备一张透明png就可以了,四周trim以下,这张图主要记录了哪些像素是透明的。可以选择任何应景的图标哦~

然后在材质中定义一下Opacity Mask为png的alpha值,Emissive Color设置为任意的发光色都可以。

由于只有alpha剔除,我们选用masked材质,特效一般不需要参与光照,所以选择unlit模式提升性能。

由于虚幻的billboard没法设置支点,所以我们只能在材质中模拟了,利用World Position Offset,沿着屏幕方向(或者正方形上方)偏移前面的Base Size即可,也就是我们设置的30,因此我们需要利用TransformVector函数将视口坐标转换成世界坐标。细心的小伙伴应该发现了,图标上下摆动的方向也是支点偏移的方向,所以2者可以叠加。

根据叠加公式,偏移值 =(边长 + 振幅 )/ 2 + 当前偏振,其中边长就是之前设置的Base Size = 30的2倍,振幅=20略小于边长的一半,因此得到30+10=40。注意之所以选用cosine而不是sine是为了同步上下2个动画时间,使得上面图标触底的时候,小圆环正好出生,从而实现拟物的视觉效果。下面的同心圆,也是先要关掉所有物理属性,选择双面材质,然后关联plane网格体以及circle材质。

同心圆算法在上一次的雷达图生成算法

注意,Opacity Mask Clip Value决定了圆环的宽度,所以要设定为一个合适的值。

‍于是就做完成了,是不是很简单呢?很多人疑惑为什么做特效要编程,然后害怕就完了,其实面向GPU的特效编程并没有想象中的那么难,依据当然有很多,但只要知道:既然有那么多人都在做特效,其中还有很多女生,说明特效编程并不是需要太多基础的。

一般的canvas算法比较符合直觉,要画圆形或方形都有直接的函数可调,但shader算法是遍历每个像素,依次着色,最终形成想要的图形,比较抽象,但也正是这种着色模型可以借助现代GPU数千个物理核心的高并发能力,实现更高级的效果。

苟日新,日日新,又日新。

Shader编程之地标特效相关推荐

  1. 【Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)屏幕水幕特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/49556461 作者:毛星云(浅 ...

  2. 【Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)屏幕像素化特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.    文章链接:  http://blog.csdn.net/poem_qianmo/article/details/50095705 作者:毛星云 ...

  3. 【Unity3D Shader编程】之十 深入理解Unity5中的Standard Shader(二)屏幕油画特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/49719247 作者:毛星云(浅 ...

  4. Unity3D Shader编程】之十 深入理解Unity5中的Standard Shader(二)屏幕油画特效的实现

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/49719247 作者:毛星云(浅 ...

  5. 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 amp; 纹理混合...

    本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星 ...

  6. 【GPU精粹与Shader编程】(一) 全系列核心知识点总览

    系列文章前言 <GPU Gems>1~3 .<GPU Pro>1~7 以及<GEM Zen>组成的GPU精粹系列书籍,是游戏开发.计算机图形学和渲染领域的业界大牛们 ...

  7. 【Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/42215079 作者:毛星云(浅墨) ...

  8. 【Unity3D Shader编程】之六 暗黑城堡篇 表面着色器 Surface Shader 的写法 一

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由@浅墨 ...

  9. Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/42215079 作者:毛星云(浅墨) ...

最新文章

  1. zynq学习02 新建一个Helloworld工程
  2. WORD2007中无法插入CMG文件
  3. Python 变量类型
  4. [云炬创业基础笔记]第七张创业资源测试
  5. 个人总结------高级知识点必会
  6. JavaParser生成,分析和修改Java代码
  7. 自主可控的全数字实时仿真软件SkyEye支持PowerPC指令级仿真
  8. servlet乱码问题
  9. 道路计划猿练级(笔者:陈浩)
  10. R语言安装包出现的问题及解决方案
  11. Hive之窗口函数(一文搞懂)
  12. App后台开发架构实践
  13. 分苹果(C语言实现)
  14. 深度学习之超分辨率算法——SRCNN
  15. Japanese Student Championship 2021
  16. Frenet和笛卡尔坐标系互转
  17. linux的常用命令
  18. java毕业设计_基于web的游泳馆管理系统的设计与实现
  19. nexus 私服 提示磁盘空间不足
  20. Win10 蓝牙已配对但无法连接的问题

热门文章

  1. 中国企业数字银行行业市场供需与战略研究报告
  2. 浅谈执行力文化(zt)
  3. 趋势操盘法则:资深操盘手6年60倍实战选股技法
  4. unity探索者之Shader Graph所有节点详解-Utility篇
  5. connect的中文意思是什么_connect是什么意思?
  6. 人工智能轨道交通行业周刊-第5期(2022.7.4-7.17)
  7. 给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(逐句精解)
  8. 什么是分布式应用开发
  9. 反向索引和自增索引区别_深度解析 百度收录与百度索引有什么区别?
  10. 【常用电子元件】光敏二极管的简介与应用(实例:STM32监测光强)