flipbook 图来自:
用于 CPUParticles3D 的 Shader:
CPUParticles3D 的 Mesh 选择 Plane 就好了
参数 FogFilpbook 是烟雾序列图
shader_type spatial;
uniform sampler2D FogFilpbook;
vec2 flipbook(vec2 uv, vec2 size, float progress){
progress = floor( mod(progress, (size.x * size.y)) );
vec2 frame_size = vec2(1.0, 1.0) / vec2(size.x, size.y);
vec2 frame = fract(uv / size) + frame_size;
frame.x += ( (progress / size.x) - frame_size.x * floor(progress/size.x) * size.x ) - frame_size.x;
frame.y += (frame_size.y * floor(progress/size.x) ) - frame_size.y ;
return frame;
}
void vertex()
{
// billboard
POSITION = PROJECTION_MATRIX *
(MODELVIEW_MATRIX * vec4(0.0, 0.0, 0.0, 1.0)
+ vec4(VERTEX.x, VERTEX.y, 0.0, 0.0));
}
void fragment()
{
vec2 flip_uv = flipbook(UV, vec2(8.0, 8.0), TIME * 10.);
vec4 flip_texture = texture(FogFilpbook, flip_uv);
ALBEDO = flip_texture.rgb;
ALPHA = flip_texture.a;
}
其中 MODELVIEW_MATRIX * vec4(0.0, 0.0, 0.0, 1.0) 的效果是将 vec4(0.0, 0.0, 0.0, 1.0) 这个坐标从物体的局部坐标 (Local Coordinate) 通过模型矩阵 Model 变换到世界坐标 (World Coordinate),世界坐标通过观察矩阵 View 变换到观察坐标(View Coordinate)
+ vec4(VERTEX.x, VERTEX.y, 0.0, 0.0) 是在观察坐标中加上物体每个点的顶点位置
最后左乘 PROJECTION_MATRIX 是观察坐标经过投影矩阵 Projection 变换到裁剪坐标(Clip Coordinate)
之后就交给引擎的渲染管线完成裁剪坐标经过透射除法 (Perspective Division) 得到标准设备空间 (Normalized Device Coordinates,NDC);NDC 坐标通过视口变换 (Viewport Transformation) 变换到屏幕空间 (Screen Coordinate) 进行显示
效果: