https://zhuanlan.zhihu.com/p/74157932
https://twitter.com/minionsart/status/1014226452378775557
https://www.cnblogs.com/crazii/p/7337143.html
这篇已经很详细了,我对他的东西做些补充
先是普通的三角函数的实现
大概是这个函数,只不过需要调整参数去你拟合真实的风吹草,当然函数比这个要复杂
s
i
n
(
x
)
+
s
i
n
(
2
∗
x
)
sin(x ) + sin(2*x)
sin(x)+sin(2∗x)
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float offset = 0;
offset += _A * sin(_w * _Time.y) * worldPos.y;
offset += _A * sin(2 * _w * _Time.y) * worldPos.y;
worldPos.z += offset * worldPos.y;
o.vertex = mul(UNITY_MATRIX_VP, worldPos);
利用采样图替代原函数
float2 samplePos = worldPos.xz / _WaveControl.w;
float waveSample = tex2Dlod(_WindNoiseTex, float4(samplePos + _Time.x, 0, 0)).r;
worldPos.x += waveSample * fix;
这样就很简单了,不过这张图需要用sd去生成,不过这种方式更加有效率
修复距离太大的变形
worldPos.x += waveSample * fix * v.vertex.y;
这里当草的位移过大的时候会有奇怪的变形和抖动,这时候需要有个平滑函数去平滑,这里可以直接用高度代替。😊