粒子(points)

发布时间 2023-04-10 15:49:20作者: escapist

粒子可以实现非常酷炫的效果,例如  烟 星星 雨火 任何事

每个Point 有一个面2个三角形组成,总是面对照相机
sizeAttenuation 距离相机越远,粒子越小 有一定的性能问题
 
使用贴图 map
默认情况下,相机前面的粒子会遮挡住后面的,也可以自己画
 
使用map 发现可以看见图片的黑色边界,如果想要黑色不显示,可以透明贴图(黑白贴图,使用这种贴图 黑色不显示)
但是使用了之后 仍然可以看见黑色边界
因为是按照顺序绘制的,一些粒子先绘制,一些后绘制,顺序不同,但是 alpha为0时, 确实还是把黑色的部分画出来了,只是将其设为不可见。怎么解决
有很多解决办法
1. alphaTest: 0.01 当不透明度低于这个值时,就不渲染了,并不完美(但是在一些边缘,黑色的部分并没有完全的隐藏,取决于你项目的精准度好像现在版本已经可以渲染地很好了)
2. depthTest = false 默认会判断这个粒子是否在其他粒子的前面,默认为true,在前面的会渲染,后面的不会渲染
    为false之后 都会渲染,最好不要修改这个,因为可能会导致其他问题,比如:其他颜色的物体,粒子会显示在立方体里面
    
    后面一些其他颜色的粒子,位置在后面但是显示在前面了,因为你不能保证粒子的绘制顺序,在只有一种颜色情况下,不会出现这个问题,因为看不出区别
 
3. depthWrite = false,是否对深度缓冲区有影响,记载粒子的深度,用来判断当前绘制的粒子应该在前面还是后面,不使用缓冲区立方体也是正常的,但是在一些特殊情况可能有bug
 
这3种方式都不会有很大的性能问题,你也可以组合使用
 
 
blending: THREE.AdditiveBlending 很多粒子在同一个地方的时候,颜色会变亮,粒子太多有性能问题 就像是多个颜色的叠加产生的效果
 
给不同的粒子 设置不同的颜色,必须要设置 vertexColors: true,material的color作为主色调 也会产生影响
然后设置 color attribute
 
星系发生器
3D对象的销毁 dispose() 方法
旋转,先弄出旋转效果,再加随机值
让大部分点都停留在 中心和分支线附近,可以使用 Math.pow 函数

 

 还有一些不足: 例如 在星系的最外层,还是有太多的点