[Godot] Flipbook & Billboard Shader

397 阅读1分钟

flipbook 图来自:

blog.unity.com/technology/…

用于 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) 进行显示

效果:

image.png