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.

粒子着色器

粒子着色器是一种特殊的着色器,它会在物体实际绘制之前运行。它的作用是计算各种材质属性,比如颜色、位置和旋转角度。至于最终的绘制效果,则可以使用任何常规的 CanvasItem(画布项)或 Spatial(空间)材质来呈现,具体取决于你的粒子是 2D 还是 3D 的。

粒子着色器非常独特,因为它并不是直接用来绘制物体本身的;它的作用是计算粒子的各项属性,而这些属性随后会被 CanvasItemSpatial 着色器所使用。它包含两个处理函数: start()process()

与其他着色器类型不同,粒子着色器会保留上一帧输出的数据。因此,粒子着色器可以被用来实现那些跨越多个帧的复杂特效。

备注

粒子着色器仅适用于基于 GPU 的粒子节点(即 GPUParticles2DGPUParticles3D )。

基于 CPU 的粒子节点(即 CPUParticles2DCPUParticles3D )是在 GPU 上进行 渲染 的(这意味着它们可以使用自定义的 CanvasItem 或 Spatial 着色器),但它们的运动是在 CPU 上进行 模拟 的。

渲染模式

渲染模式

描述

keep_data

不要在重启时清除以前的数据.

disable_force

禁用吸引器力。

disable_velocity

忽略 VELOCITY 值.

collision_use_scale

为进行碰撞而缩放粒子的大小。

内置

标记为 in (输入)的值是只读的。标记为 out (输出)的值可以被写入(赋值),但它们不一定包含有意义的初始值。标记为 inout (输入输出)的值会提供一个合理的默认值,并且可以被选择性地写入。采样器(Samplers)不能被写入,所以没有进行任何标记。

全局内置变量

全局的内置在所有地方均可用,包括自定义函数中。

内置

描述

in float TIME

自引擎启动以来的全局时间,以秒为单位。它每经过 3,600 秒就会重置循环一次(这个时长可以通过 rollover 设置来修改)。它受 time_scale (时间缩放/游戏速度)的影响,但不受暂停(pausing)的影响。如果你需要一个不受 time_scale 影响的 TIME 变量,可以添加你自己的 global shader uniform ,并在每一帧更新它。

in float PI

常量 PI (值为 3.141592 )。它是圆的周长与直径的比值,也是转半圈(180度)所包含的弧度数。

in float TAU

常量 TAU (值为 6.283185 )。它等同于 PI * 2 ,也就是一个完整圆周(整圈)所包含的弧度数。

in float E

常量 E (值为 2.718281 )。即欧拉数,自然对数的底数。

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

当粒子处于活跃(激活)状态时,它的值为 true ;你可以将其设置为 false

inout vec4 COLOR

粒子颜色,支持写入数据,并且可以在网格(mesh)的顶点函数中访问。

inout vec3 VELOCITY

粒子的速度,可以修改。

inout mat4 TRANSFORM

粒子变换。

inout vec4 CUSTOM

自定义粒子数据。可以在网格(mesh)的着色器中通过 INSTANCE_CUSTOM 来访问。

inout float MASS

粒子质量,通常用于配合吸引器(attractors)使用。默认值为 1.0

in vec4 USERDATAX

这个向量(Vector)用于将额外的用户自定义数据整合到粒子处理着色器(particle process shader)中。 USERDATAX 是六个通过数字来区分的内置变量,其中的 X 可以是 1 到 6 之间的数字,例如 USERDATA3

in uint FLAG_EMIT_POSITION

这是 emit_subparticle() 函数最后一个参数的一个标志,用于给新粒子的变换(transform)分配一个自定义位置。

in uint FLAG_EMIT_ROT_SCALE

这是 emit_subparticle() 函数最后一个参数的一个标志,用于给新粒子的变换(transform)分配自定义的旋转和缩放。

in uint FLAG_EMIT_VELOCITY

这是 emit_subparticle() 函数最后一个参数的一个标志,用于给新粒子分配一个自定义速度。

in uint FLAG_EMIT_COLOR

这是 emit_subparticle() 函数最后一个参数的一个标志,用于给新粒子分配一个自定义颜色。

in uint FLAG_EMIT_CUSTOM

这是 emit_subparticle() 函数最后一个参数的一个标志,用于给新粒子分配一个自定义数据向量。

in vec3 EMITTER_VELOCITY

Particles2D3D)节点的速度。

in float INTERPOLATE_TO_END

Particles(粒子)节点的 interp_to_end (3D) 属性的值。

in uint AMOUNT_RATIO

Particles(粒子)节点的 amount_ratio3D)属性的值。

备注

如果想在 StandardMaterial3D(标准3D材质)中使用 COLOR 变量,请将 vertex_color_use_as_albedo 设置为 true 。而在 ShaderMaterial(着色器材质)中,直接通过 COLOR 变量来访问它即可。

Start 内置

内置

描述

in bool RESTART_POSITION

如果粒子被重新启动,或者是在没有自定义位置的情况下被发射出来的(也就是说,这个粒子是通过 emit_subparticle() 发射的,并且没有带上 FLAG_EMIT_POSITION 标志),则返回 true (真)。

in bool RESTART_ROT_SCALE

如果粒子被重新启动,或者是在没有自定义旋转或缩放的情况下被发射出来的(也就是说,这个粒子是通过 emit_subparticle() 发射的,并且没有带上 FLAG_EMIT_ROT_SCALE 标志),则返回 true (真)。

in bool RESTART_VELOCITY

如果粒子被重新启动,或者是在没有自定义速度的情况下被发射出来的(也就是说,这个粒子是通过 emit_subparticle() 发射的,并且没有带上 FLAG_EMIT_VELOCITY 标志),则返回 true (真)。

in bool RESTART_COLOR

如果粒子被重新启动,或者是在没有自定义颜色的情况下被发射出来的(也就是说,这个粒子是通过 emit_subparticle() 发射的,并且没有带上 FLAG_EMIT_COLOR 标志),则返回 true (真)。

in bool RESTART_CUSTOM

如果粒子被重新启动,或者是在没有自定义属性的情况下被发射出来的(也就是说,这个粒子是通过 emit_subparticle() 发射的,并且没有带上 FLAG_EMIT_CUSTOM 标志),则返回 true (真)。

Process 内置

内置

描述

in bool RESTART

如果当前处理的这一帧是该粒子的第一帧,则返回 true (真)。

in bool COLLIDED

粒子与粒子碰撞器碰撞时为 true

in vec3 COLLISION_NORMAL

最后一次碰撞的法线。如果没有检测到碰撞,则该值等于 (0.0, 0.0, 0.0)

in float COLLISION_DEPTH

最后一次碰撞的法线长度。如果没有检测到碰撞,则该值等于 0.0

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)发射一个粒子。