挺简单的,就是横向和纵向加一些sin和cos进行扰动代码如下
float3 GetWindEffect(float3 VertexWorldPos, float VertexColorRed, float GrassUV, float WindSpeed, float WindStrenth, float GameTime, float bGrass)
{
float Timer = GameTime * WindSpeed;
float3 WindOffset = float3(0, 0, 0);
float3 GrassWindOffset = float3(0, 0, 0);
//树木
if (bGrass < 0.5)
{
WindOffset.x = sin(cos(Timer + VertexWorldPos.x)) * WindStrenth * VertexColorRed;
WindOffset.z = cos(sin(Timer + VertexWorldPos.z) + VertexWorldPos.z) * WindStrenth * VertexColorRed;
return WindOffset;
}
//草
else
{
// float WindDirectionX = sin(Timer) + VertexWorldPos.y
float UVChange = 1 - abs(GrassUV);
GrassWindOffset.z = UVChange * sin(cos(Timer + VertexWorldPos.z)) * WindStrenth;
GrassWindOffset.x = UVChange * cos(sin(Timer + VertexWorldPos.x)) * WindStrenth;
GrassWindOffset.y = 0;
return GrassWindOffset;
}
return WindOffset;
}
有一个float值bGrass区分这个物体时草还是树。
草的根部固定用的是UV衰减,植被使用顶点色来控制树叶根部晃动幅度小于树叶的晃动幅度。