前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >镜面光泽效果

镜面光泽效果

作者头像
异名
发布2020-06-09 12:58:01
5190
发布2020-06-09 12:58:01
举报
文章被收录于专栏:异名异名

镜面上扫过一道光泽是UI里面很常用的一种特效,通常用来强调某个物体或者凸显物体的“稀有”价值,比如卡片中扫过一道光芒等

demo

实现思路

根据这个效果的实际需求,可以提取到两个关键点,一个是光路的生成,一个是光路随着时间进行偏移。直观可以看出光路由两根斜率一样的直线组成,其中一根在x轴上偏移一定的距离,两根斜线就能够组成一个倾斜的区域,这个区域用数学来表达就是:两根斜线形成的不等式组。直线的斜截式方程是y = kx + b,假设斜率k为1,那光路的区域就可以表示为:x >= -yx <= -y + width,其中width就是我们定义的光路的宽度,有了区域之后我们只需要让符合该区域的像素点色彩叠加点变化就可以实现光路的效果。

代码语言:javascript
复制
void main () {
  vec4 color = vec4(1, 1, 1, 1);
  color *= texture(texture, v_uv0);

  if (v_uv0.x >= -v_uv0.y && v_uv0.x <= -v_uv0.y + width) {
    color *= strength;
  }

  gl_FragColor = color;
}

光路随着时间的偏移效果,其实就是让光路的斜距随着时间的变化增加就可以了。这里可以通过脚本的方式在每帧的回调中把偏移的距离动态传进来,但是这种传递其实挺耗性能的,还有一种方式就是我们可以引入cc-global,然后通过cc_time.x拿到累积的时间参数,然后加上我们的偏移限制来实现光路的循环播放。其中我们光路的起点应该是0.0 - width,光路的偏移长度应该是width + 1.0 + width

代码语言:javascript
复制
#include <cc-global>
void main () {
  vec4 color = vec4(1, 1, 1, 1);
  color *= texture(texture, v_uv0);

  float time_step = -width;
  time_step += mod(cc_time.x, width + 1.0 + width);

  if (v_uv0.x >= -v_uv0.y + time_step && v_uv0.x <= -v_uv0.y + width + time_step) {
    color *= strength;
  }

  gl_FragColor = color;
}

为了让效果呈现更加完美,我们还可以去调整一下光路的斜率,如果需要多条光路的话,也可以多复制几个不等式组加上不同的偏移距离和宽度就可以了。另外引擎是默认启用了动态合图,它会自动将合适的贴图动态合并到一张大图上来减少drawcall,这样子就会导致我们在effect中拿到的uv坐标不准确,我们可以通过 cc.dynamicAtlasManager.enabled = false 把合图给关掉,但是这是个全局开关,所以更好的方法是在资源管理面板中把该资源的packable勾选掉,这样子它就不会被打包到合图中了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 异名 微信公众号,前往查看

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

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档