镜面光泽效果

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

demo

实现思路

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

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

#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勾选掉,这样子它就不会被打包到合图中了。

效果预览

源码获取请点击查看原文,长按二维码查看效果????

ewm

我是异名,你的阅读是我的动力

 

溶解效果(shader)   追光效果(shader)   

放大镜效果     微信小游戏首包超出4M之后  

移动残影效果    刮刮卡实现     子弹跟踪效果

遥控杆实现      背景无限滚动   金币落袋效果 

 富文本打字机效果   圆形头像(shader)

使用cocos进行2D和3D混合开发   

Cocos游戏开发入门最佳实践

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实时折射和镜面反射是计算机图形学中的常见技术,可以通过shader实现。 实时折射可以让物体看起来像是在水中或者玻璃中,实现方法是根据物体表面法线和视线方向计算出入射角度,然后使用Snell定律计算出折射角度,并使用该角度计算出折射向量。最后根据折射向量计算出折射贴图的颜色。 镜面反射可以让物体看起来像是镜子一样反射周围的环境。实现方法是根据物体表面法线和视线方向计算出反射向量,并使用该向量计算出反射贴图的颜色。 这两种技术都需要使用光线追踪或者逐像素计算,所以需要一定的计算资源。但是它们可以大大提升场景的真实感和质量。 ### 回答2: 实时折射和镜面反射是计算机图形学中常用的shader技术,用于模拟光线在物体表面的不同反射行为。 实时折射shader是一种技术,用于模拟光线在通过透明物体的过程中发生的折射现象。它通过对光线的入射角度、折射率和物体表面法线的计算,来确定从折射点射出的光线方向。这样,我们就能够在渲染物体时,准确地模拟出光线经过透明物体时的折射效果,使得物体的表面能够呈现出折射光线的幻觉。 镜面反射shader是一种技术,用于模拟光线在物体表面的反射现象。它通过计算光线的入射角度、物体表面法线和反射方向的计算,来模拟光线在物体表面的反射行为。通过镜面反射shader,我们能够将光线在物体表面的反射效果准确地呈现出来,使得物体看起来有光泽镜面的特性。 这两种shader技术通常都是配合渲染引擎使用的,可以在现实时间内进行计算和渲染,通过对光线进行跟踪和反射的计算,实现逼真的光影效果。在游戏、电影和虚拟现实等领域中,实时折射和镜面反射shader技术的应用非常广泛,能够提升场景的真实感和逼真度。 总而言之,实时折射和镜面反射shader是计算机图形学中常用的技术,通过模拟光线在透明物体和物体表面的反射行为,能够达到逼真的光影效果,为场景渲染带来更高的真实感和视觉效果。 ### 回答3: 实时折射和镜面反射是在计算机图形学中使用的两种shader技术。 实时折射是通过模拟光线穿过透明物体时的折射效果,使物体在不同的视角下具有类似于真实物体的折射现象。它基于菲涅尔定律,结合材料的折射率和光线的入射角度,计算出光线折射出物体后的方向和强度。实时折射的效果通常应用于玻璃、水、钻石等具有折射特性的物体表面。 镜面反射是模拟光线击中物体表面后的反射效果,使物体呈现出类似于镜子的反射效果。它基于反射角与入射角相等的法则,在计算出光线击中物体表面后的反射方向和强度。镜面反射的效果通常应用于金属、玻璃等光滑的表面。 实时折射和镜面反射的实现借助于计算机图形学中的计算模型和光线追踪算法。通过对光线和物体的交互过程进行模拟计算,可以得到真实感觉的折射和反射效果。这些效果对于实时渲染、游戏开发以及虚拟现实等应用具有重要意义,能够提高场景的真实感和沉浸感。 为了实现实时折射和镜面反射,通常需要考虑光线和材质的物理特性、环境光照和视角等因素。同时,还需要合理选择合适的算法和优化技术,以便在保证效果的同时提高计算速度,使得实时渲染成为可能。随着图形硬件的不断发展,实时折射和镜面反射的实现也得到了越来越好的结果。 总之,实时折射和镜面反射是计算机图形学中常用的两种shader技术,通过模拟物体与光线的交互来实现真实感的折射和反射效果,具有重要的应用意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值