Skip to content

JULIUSJIANG/u3d_ball_effect

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

防地面切边的球状特效

如果对您有所帮助,希望您给我个 Star!

ezgif com-video-to-gif (2)

应用示例

ezgif com-video-to-gif (1)

简介

  • 用 Unity 的 Particle System 制作特效的时候,经常需要用一个 Billboard 模式的片去实现一个球状特效(能量球、冲击波、爆闪等)

    内容为光球的片

    texture_ball

    实现的效果

    微信图片_20231208121113
  • 通过 Billboard,仅用 4 个顶点即可实现球状效果,对比使用球状网格,这样大大降低了 Cpu、Gpu 的消耗,但这种实现方式在高度不够的时候容易发生切片

    1702009121826
  • 该解决方案通过顶点着色器控制网格的 6 个顶点的世界坐标、纹理采样坐标来解决上述提到的切边问题

    1702010028933
  • 目前该解决方案已应用到个人制作的各个特效中,效果稳定可靠,在使用上遇到问题或者有任何疑问,欢迎发送邮件到 2662774600@qq.com 进行反馈

缺点

  • 需要指定当前地面的 Y 坐标

  • 不支持旋转

查看 demo

使用手册

  • Particle System 引用的材质中的着色器换成 Jiang/ParticleSystemFoldAdd(项目中需要有 shader_particle_system_fold.shader),Texture 设置为效果纹理,GroundY 设置为地面的 Y 坐标(默认为 0)

    1702011472538
  • Particle System 的 Render Mode 改为 Mesh

    1702011518788
  • 把网格设置成 ball_effect(项目中需要有 fbx_ball_effect.fbx)

    1702011576149
  • 勾选 Custom Vertex Streams

    1702012289869
  • 添加 Tangent、Center,注意次序不能乱

    1702012552651
  • 至此,所有发射出来的粒子都会自动防止地面切边

实现思路

fbx_ball_effect.fbx 中的网格 ball_effect 是一个自带折痕的片,网格数据中折痕坐标与下边界重合,但通过判断纹理采样的坐标,能分辨出顶点是上边界顶点、折痕顶点还是下边界顶点

1702013250586

shader_particle_system_fold.shader 中的顶点着色器,用于决定如何对折网格 ball_effect 来达到效果:

  • 粒子没与地板接触:此时效果相当于纯粹的 BillBoard

  • 粒子下半与地板接触:上边界不动,折痕自动置于被地板相切的坐标,下边界也置于地板平面,但根据透视向摄像机平移

  • 粒子上半与地板接触:上边界不动,折痕自动置于被地板相切的坐标,下边界也置于地板平面,但根据透视向摄像机平移,而且颜色采样会跟上边界一致,以模仿球体的浸入效果

  • 粒子完全被地板覆盖:此时效果相当于纯粹的 BillBoard