优化项目架构
This commit is contained in:
54
SproutFarm-Frontend/Shader/PlantSwayShader.gdshader
Normal file
54
SproutFarm-Frontend/Shader/PlantSwayShader.gdshader
Normal file
@@ -0,0 +1,54 @@
|
||||
shader_type canvas_item;
|
||||
|
||||
// 摆动参数
|
||||
uniform float sway_strength : hint_range(0.0, 0.05) = 0.02; // 摆动强度
|
||||
uniform float sway_speed : hint_range(0.1, 5.0) = 1.0; // 摆动速度
|
||||
uniform float wind_direction : hint_range(-1.0, 1.0) = 0.0; // 风向偏移
|
||||
uniform float sway_variation : hint_range(0.0, 2.0) = 0.5; // 摆动变化
|
||||
|
||||
// 高度影响参数
|
||||
uniform float sway_start_height : hint_range(0.0, 1.0) = 0.3; // 开始摆动的高度比例
|
||||
uniform float height_curve : hint_range(1.0, 4.0) = 2.0; // 高度影响曲线
|
||||
|
||||
void fragment() {
|
||||
vec2 uv = UV;
|
||||
|
||||
// 计算摆动强度(只有上半部分摆动)
|
||||
float height_factor = 0.0;
|
||||
if (uv.y < sway_start_height) {
|
||||
// 计算从底部到摆动开始位置的渐变
|
||||
height_factor = pow((sway_start_height - uv.y) / sway_start_height, height_curve);
|
||||
}
|
||||
|
||||
// 创建多层摆动效果
|
||||
float time_offset = TIME * sway_speed;
|
||||
|
||||
// 主摆动波
|
||||
float main_sway = sin(time_offset + uv.y * 3.14159) * sway_strength;
|
||||
|
||||
// 次级摆动波(频率更高,幅度更小)
|
||||
float secondary_sway = sin(time_offset * 2.3 + uv.y * 6.28318) * sway_strength * 0.3;
|
||||
|
||||
// 第三层摆动(更细微的抖动)
|
||||
float micro_sway = sin(time_offset * 4.7 + uv.y * 12.56636) * sway_strength * 0.1;
|
||||
|
||||
// 结合所有摆动
|
||||
float total_sway = (main_sway + secondary_sway + micro_sway) * height_factor;
|
||||
|
||||
// 添加风向偏移
|
||||
total_sway += wind_direction * sway_strength * height_factor * 0.5;
|
||||
|
||||
// 添加摆动变化(随机性)
|
||||
float variation = sin(time_offset * 0.37 + uv.x * 6.28318) * sway_variation * 0.01;
|
||||
total_sway += variation * height_factor;
|
||||
|
||||
// 应用摆动到UV坐标
|
||||
uv.x += total_sway;
|
||||
|
||||
// 边界检查,防止UV超出范围
|
||||
if (uv.x < 0.0 || uv.x > 1.0) {
|
||||
COLOR = vec4(0.0, 0.0, 0.0, 0.0); // 透明
|
||||
} else {
|
||||
COLOR = texture(TEXTURE, uv);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user