哈希函数
// 哈希函数:把一个 vec2 坐标变成 0,1 内的"伪随机"值
// 为什么用 sin?sin 对整数坐标会产生复杂的小数,fract 取小数部分
// 为什么乘以 43758.5?放大小差异,让不同格子差别明显
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453);
}
水波碰撞函数
h(r, t) = sin(r/λ - ωt) × A × e^(-αr) × e^(-βt)
-
`r` = 到波源的距离(`length(p - center)`)
-
`λ` = 波长(控制波纹疏密)
-
`ω` = 角频率(控制传播速度)
-
`A × e^(-αr)` = 空间衰减(距离越远越弱)
-
`e^(-βt)` = 时间衰减(可选,模拟阻尼)多个波源的总高度:直接相加。
// 单个圆形水波
// center: 波源位置
// speed: 传播速度(频率)
// wLen: 波长(控制疏密)
// decay: 空间衰减系数
float ripple(vec2 p, vec2 center, float speed, float wLen, float decay) {
float r = length(p - center);
float phase = r / wLen - TIME * speed;
float amplitude = exp(-r * decay); // 空间衰减:越远越弱
return sin(phase * 6.28318) * amplitude; // 6.28318 = 2π(完整正弦周期)
}