U3d Ball Effect
让 Unity Particle System 发射的球状粒子不再与地面产生切边
Unity Project
Built with Unity 2018.4.12f1 · download the source from GitHub
README
防地面切边的球状特效
如果对您有所帮助,希望您给我个 Star!
应用示例
简介
用 Unity 的 Particle System 制作特效的时候,经常需要用一个 Billboard 模式的片去实现一个球状特效(能量球、冲击波、爆闪等)
内容为光球的片
实现的效果
通过 Billboard,仅用 4 个顶点即可实现球状效果,对比使用球状网格,这样大大降低了 Cpu、Gpu 的消耗,但这种实现方式在高度不够的时候容易发生切片
该解决方案通过顶点着色器控制网格的 6 个顶点的世界坐标、纹理采样坐标来解决上述提到的切边问题
目前该解决方案已应用到个人制作的各个特效中,效果稳定可靠,在使用上遇到问题或者有任何疑问,欢迎发送邮件到 2662774600@qq.com 进行反馈
缺点
需要指定当前地面的 Y 坐标
不支持旋转
查看 demo
unity
安装 Unity 2018.4.12f1
运行场景 scene_index
使用手册
Particle System 引用的材质中的着色器换成 Jiang/ParticleSystemFoldAdd(项目中需要有 shader_particle_system_fold.shader),Texture 设置为效果纹理,GroundY 设置为地面的 Y 坐标(默认为 0)
Particle System 的 Render Mode 改为 Mesh
把网格设置成 ball_effect(项目中需要有 fbx_ball_effect.fbx)
勾选 Custom Vertex Streams
添加 Tangent、Center,注意次序不能乱
至此,所有发射出来的粒子都会自动防止地面切边
实现思路
fbx_ball_effect.fbx 中的网格 ball_effect 是一个自带折痕的片,网格数据中折痕坐标与下边界重合,但通过判断纹理采样的坐标,能分辨出顶点是上边界顶点、折痕顶点还是下边界顶点
shader_particle_system_fold.shader 中的顶点着色器,用于决定如何对折网格 ball_effect 来达到效果:
粒子没与地板接触:此时效果相当于纯粹的 BillBoard
粒子下半与地板接触:上边界不动,折痕自动置于被地板相切的坐标,下边界也置于地板平面,但根据透视向摄像机平移
粒子上半与地板接触:上边界不动,折痕自动置于被地板相切的坐标,下边界也置于地板平面,但根据透视向摄像机平移,而且颜色采样会跟上边界一致,以模仿球体的浸入效果
粒子完全被地板覆盖:此时效果相当于纯粹的 BillBoard
Comments
No comments yet. Be the first!
Sign in to join the conversation
Sign In