Как сделать собственную траву, которая качается также как и встроенная террейновская?
В исходных шейдерах качение травы задается здесь:
Синтаксис:
Используется csharp
CBUFFER_START(UnityTerrain)
float4 _WaveAndDistance; // wind speed, wave size, wind amount, max sqr distance
CBUFFER_END
//vertex - позиция вершины, ее тут двигают
//waveAmount - высота вершины относительно травинки
//color не нужен
fixed4 TerrainWaveGrass (inout float4 vertex, float waveAmount, fixed4 color)
{
//какие-то магические числа
float4 _waveXSize = float4(0.012, 0.02, 0.06, 0.024) * _WaveAndDistance.y;
float4 _waveZSize = float4 (0.006, .02, 0.02, 0.05) * _WaveAndDistance.y;
float4 waveSpeed = float4 (0.3, .5, .4, 1.2) * 4;
float4 _waveXmove = float4(0.012, 0.02, -0.06, 0.048) * 2;
float4 _waveZmove = float4 (0.006, .02, -0.02, 0.1);
float4 waves;
waves = vertex.x * _waveXSize;
waves += vertex.z * _waveZSize;
// Add in time to model them over time
waves += _WaveAndDistance.x * waveSpeed;
//s - вектор из 4 степеней синуса waves
float4 s, c;
waves = frac (waves);
FastSinCos (waves, s,c);
s = s * s;
s = s * s;
s = s * waveAmount;
float3 waveMove = float3 (0,0,0);
waveMove.x = dot (s, _waveXmove);
waveMove.z = dot (s, _waveZmove);
//собственно само движение вершины от ветра
vertex.xz -= waveMove.xz * _WaveAndDistance.z;
}
float4 _WaveAndDistance; // wind speed, wave size, wind amount, max sqr distance
CBUFFER_END
//vertex - позиция вершины, ее тут двигают
//waveAmount - высота вершины относительно травинки
//color не нужен
fixed4 TerrainWaveGrass (inout float4 vertex, float waveAmount, fixed4 color)
{
//какие-то магические числа
float4 _waveXSize = float4(0.012, 0.02, 0.06, 0.024) * _WaveAndDistance.y;
float4 _waveZSize = float4 (0.006, .02, 0.02, 0.05) * _WaveAndDistance.y;
float4 waveSpeed = float4 (0.3, .5, .4, 1.2) * 4;
float4 _waveXmove = float4(0.012, 0.02, -0.06, 0.048) * 2;
float4 _waveZmove = float4 (0.006, .02, -0.02, 0.1);
float4 waves;
waves = vertex.x * _waveXSize;
waves += vertex.z * _waveZSize;
// Add in time to model them over time
waves += _WaveAndDistance.x * waveSpeed;
//s - вектор из 4 степеней синуса waves
float4 s, c;
waves = frac (waves);
FastSinCos (waves, s,c);
s = s * s;
s = s * s;
s = s * waveAmount;
float3 waveMove = float3 (0,0,0);
waveMove.x = dot (s, _waveXmove);
waveMove.z = dot (s, _waveZmove);
//собственно само движение вершины от ветра
vertex.xz -= waveMove.xz * _WaveAndDistance.z;
}
Как видно, качение травы определяется внешней переменной _WaveAndDistance. Но если я просто создаю ГО со своим подобным шейдером, то качения не наблюдается, видимо потому что _WaveAndDistance в моем шейдере не меняется, а значение качения пишется скриптом террейна только непосредственно в CBuffer материала травы мимо моего шейдера.
Собственно для создания идентичного качения надо
либо знать по каким принципам считается _WaveAndDistance в террейне
либо каким-то образом вытащить это значение из материала травы
Есть наводки?