У меня есть задание. Мне нужно создать скрипт шейдера с волнами, чтобы каждая волна была случайного размера. Я попытался создать его, создав сценарий C#, чтобы передать случайное значение в сценарий шейдера, а затем умножить мой ввод вершин на это значение, но когда я это делаю, все значения Y умножаются, как и ожидалось, и это не тот результат, который мне нужен. Мне нужно умножить заданную c одну волну (один пи) синусоидальной волны, чтобы увеличить только одну волну, а не все точки y. Также случайное значение меняется слишком быстро, но я могу это исправить самостоятельно.
Я новичок ie в скриптовых шейдерах, так что, насколько я понял:
Shader "Custom/Waves"
{
Properties{
_Color("Color", Color) = (0, 0, 0, 1)
_Strength("Strength", Range(0, 2)) = 1.0
_Speed("Speed", Range(-200,200)) = 100
}
SubShader{
Tags{
"RenderType" = "transparent"
}
Pass{
Cull Off
CGPROGRAM
#pragma vertex vertexFunc
#pragma fragment fragFunc
float4 _Color;
float _Strength;
float _Speed;
struct vertexInput {
float4 vertex : POSITION;
};
struct vertexOutput {
float4 pos : SV_POSITION;
};
vertexOutput vertexFunc(vertexInput v) {
vertexOutput o;
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
float a = 1;
float displacement = (cos(worldPos.y) + cos(worldPos.x + _Speed * _Time.y));
worldPos.y = worldPos.y + (displacement * _Strength);
o.pos = mul(UNITY_MATRIX_VP, worldPos);
return o;
}
float4 fragFunc(vertexOutput IN) : COLOR{
return _Color;
}
ENDCG
}
}
}
C# скрипт для случайного значения:
public class RandomValue: MonoBehaviour
{
public Material material;
public float Max = 2.0f;
// Start is called before the first frame update
// Update is called once per frame
void Update()
{
float number = Random.Range(0.0f, Max);
material.SetFloat("_Strength", number);
}
}
Может кто-нибудь объяснить мне, как применить случайное значение к определенной c части синусоиды, которая движется в вершине x.