Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
粒子着色器
粒子着色器是一种特殊的着色器,它会在物体实际绘制之前运行。它的作用是计算各种材质属性,比如颜色、位置和旋转角度。至于最终的绘制效果,则可以使用任何常规的 CanvasItem(画布项)或 Spatial(空间)材质来呈现,具体取决于你的粒子是 2D 还是 3D 的。
粒子着色器非常独特,因为它并不是直接用来绘制物体本身的;它的作用是计算粒子的各项属性,而这些属性随后会被 CanvasItem 或 Spatial 着色器所使用。它包含两个处理函数: start() 和 process() 。
与其他着色器类型不同,粒子着色器会保留上一帧输出的数据。因此,粒子着色器可以被用来实现那些跨越多个帧的复杂特效。
备注
粒子着色器仅适用于基于 GPU 的粒子节点(即 GPUParticles2D 和 GPUParticles3D )。
基于 CPU 的粒子节点(即 CPUParticles2D 和 CPUParticles3D )是在 GPU 上进行 渲染 的(这意味着它们可以使用自定义的 CanvasItem 或 Spatial 着色器),但它们的运动是在 CPU 上进行 模拟 的。
渲染模式
渲染模式 |
描述 |
|---|---|
keep_data |
不要在重启时清除以前的数据. |
disable_force |
禁用吸引器力。 |
disable_velocity |
忽略 |
collision_use_scale |
为进行碰撞而缩放粒子的大小。 |
内置
标记为 in (输入)的值是只读的。标记为 out (输出)的值可以被写入(赋值),但它们不一定包含有意义的初始值。标记为 inout (输入输出)的值会提供一个合理的默认值,并且可以被选择性地写入。采样器(Samplers)不能被写入,所以没有进行任何标记。
全局内置变量
全局的内置在所有地方均可用,包括自定义函数中。
内置 |
描述 |
|---|---|
in float TIME |
自引擎启动以来的全局时间,以秒为单位。它每经过 |
in float PI |
常量 |
in float TAU |
常量 |
in float E |
常量 |
Start 和 Process 内置
这些属性既可以在 start() 函数中访问,也可以在 process() 函数中访问。
函数 |
描述 |
|---|---|
in float LIFETIME |
粒子寿命。 |
in float DELTA |
处理时间差。 |
in uint NUMBER |
发射开始后的唯一编号。 |
in uint INDEX |
粒子索引(在所有粒子范围内)。 |
in mat4 EMISSION_TRANSFORM |
发射器变换(用于非本地坐标系)。 |
in uint RANDOM_SEED |
随机种子,是随机的基础。 |
inout bool ACTIVE |
当粒子处于活跃(激活)状态时,它的值为 |
inout vec4 COLOR |
粒子颜色,支持写入数据,并且可以在网格(mesh)的顶点函数中访问。 |
inout vec3 VELOCITY |
粒子的速度,可以修改。 |
inout mat4 TRANSFORM |
粒子变换。 |
inout vec4 CUSTOM |
自定义粒子数据。可以在网格(mesh)的着色器中通过 |
inout float MASS |
粒子质量,通常用于配合吸引器(attractors)使用。默认值为 |
in vec4 USERDATAX |
这个向量(Vector)用于将额外的用户自定义数据整合到粒子处理着色器(particle process shader)中。 |
in uint FLAG_EMIT_POSITION |
这是 |
in uint FLAG_EMIT_ROT_SCALE |
这是 |
in uint FLAG_EMIT_VELOCITY |
这是 |
in uint FLAG_EMIT_COLOR |
这是 |
in uint FLAG_EMIT_CUSTOM |
这是 |
in vec3 EMITTER_VELOCITY |
Particles2D(3D)节点的速度。 |
in float INTERPOLATE_TO_END |
Particles(粒子)节点的 interp_to_end (3D) 属性的值。 |
in uint AMOUNT_RATIO |
Particles(粒子)节点的 amount_ratio (3D)属性的值。 |
备注
如果想在 StandardMaterial3D(标准3D材质)中使用 COLOR 变量,请将 vertex_color_use_as_albedo 设置为 true 。而在 ShaderMaterial(着色器材质)中,直接通过 COLOR 变量来访问它即可。
Start 内置
内置 |
描述 |
|---|---|
in bool RESTART_POSITION |
如果粒子被重新启动,或者是在没有自定义位置的情况下被发射出来的(也就是说,这个粒子是通过 |
in bool RESTART_ROT_SCALE |
如果粒子被重新启动,或者是在没有自定义旋转或缩放的情况下被发射出来的(也就是说,这个粒子是通过 |
in bool RESTART_VELOCITY |
如果粒子被重新启动,或者是在没有自定义速度的情况下被发射出来的(也就是说,这个粒子是通过 |
in bool RESTART_COLOR |
如果粒子被重新启动,或者是在没有自定义颜色的情况下被发射出来的(也就是说,这个粒子是通过 |
in bool RESTART_CUSTOM |
如果粒子被重新启动,或者是在没有自定义属性的情况下被发射出来的(也就是说,这个粒子是通过 |
Process 内置
内置 |
描述 |
|---|---|
in bool RESTART |
如果当前处理的这一帧是该粒子的第一帧,则返回 |
in bool COLLIDED |
粒子与粒子碰撞器碰撞时为 |
in vec3 COLLISION_NORMAL |
最后一次碰撞的法线。如果没有检测到碰撞,则该值等于 |
in float COLLISION_DEPTH |
最后一次碰撞的法线长度。如果没有检测到碰撞,则该值等于 |
in vec3 ATTRACTOR_FORCE |
当前时刻所有引力源(attractors)对该粒子产生的合力。 |
Process 函数
目前, emit_subparticle() 是粒子着色器中唯一支持的自定义函数。它允许用户通过子发射器,按照指定的参数来生成一个新的粒子。这个新生成的粒子只会应用与 flags 参数相匹配的那些属性。例如,下面的代码会发射一个带有指定位置、速度和颜色的粒子,但不会指定它的旋转、缩放以及自定义数值。
mat4 custom_transform = mat4(1.0);
custom_transform[3].xyz = vec3(10.5, 0.0, 4.0);
emit_subparticle(custom_transform, vec3(1.0, 0.5, 1.0), vec4(1.0, 0.0, 0.0, 1.0), vec4(1.0), FLAG_EMIT_POSITION | FLAG_EMIT_VELOCITY | FLAG_EMIT_COLOR);
函数 |
描述 |
|---|---|
bool emit_subparticle (mat4 xform, vec3 velocity, vec4 color, vec4 custom, uint flags) |
从子发射器(sub-emitter)发射一个粒子。 |