Применение случайного значения с плавающей запятой к синусоидальной волне шейдера для одного пи (например: для создания волны, но каждая волна имеет разный размер) - PullRequest
1 голос
/ 08 января 2020

У меня есть задание. Мне нужно создать скрипт шейдера с волнами, чтобы каждая волна была случайного размера. Я попытался создать его, создав сценарий 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.

1 Ответ

0 голосов
/ 20 января 2020

Изменение амплитуды отдельных волн довольно сложно и требует от вас создания какой-то функции, которая позволяет вам работать с отдельными пиками волн. Это достаточно просто, когда ваша волна зависит от единственной координаты, но усложняется, когда пики также зависят от косинуса значения Y (вы хотели использовать Z? Y в Unity!). Я думаю, что в целом вы также можете добавить несколько дополнительных уровней случайности к своим волнам в целом, чтобы они выглядели более разнообразными и динамичными c.

Один из вариантов - использовать поле процедурного шума и использовать положение вершины X / Z в качестве UV-координат. Вы можете умножить это на свое значение синуса, чтобы получить некоторое отклонение, и даже сместить шумовое УФ-излучение по времени, чтобы получить дополнительное измерение движения. Здесь есть хорошая реализация градиентного шума:

https://www.shadertoy.com/view/XdXGW8

Однако, когда дело доходит до симуляции нескольких волн в океане, наиболее распространенным методом является использование Быстрое преобразование Фурье для имитации суммы тысяч частот и амплитуд волн при низких вычислительных затратах. Это то, что использует большинство игр AAA. Здесь задействована некоторая математика инженерного уровня, но есть некоторые ресурсы и проекты GitHub, которые можно проверить онлайн. Как правило, вы выполняете преобразование Фурье в вычислительном шейдере или в графическом процессоре, а затем отправляете их в вершинный / фрагментный шейдер в форме текстуры.

https://arm-software.github.io/opengl-es-sdk-for-android/ocean_f_f_t.html

https://www.keithlantz.net/2011/11/ocean-simulation-part-two-using-the-fast-fourier-transform/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...