Материал, имитирующий прибой [UE4]
Добрый день. Сегодня мы рассмотрим, как создать материал, имитирующий прибой. Для этого нам понадобится функция "DistanceToNearestSurface", функция "Noise" или какая-нибудь текстура с шумом и немного фантазии. В конце поста есть ссылка на видеоурок.
Подготовка проекта
Первым делом нужно включить опцию "Generate Mesh Distance Fields" в настройках проекта. Это необходимо для корректной работы функции "DistanceToNearestSurface".
Затем открываем "World Settings" и задаем необходимую нам дальность прорисовки "Global DistanceField View Distance".
Нужно подбирать данное значение исходя из размеров вашей области, так как если задать слишком маленькое значение, то волны будут резко обрываться, а если задать слишком большое значение, то будет страдать качество.
Материал мы будем применять к плоскости, которая служит поверхностью океана. Расстояние от дна океана до поверхности (плоскости) должно быть достаточно большим, иначе на всей поверхности могут появляться различные артефакты. У нас будет параметр, позволяющий регулировать это расстояние, но поскольку это расстояние связано с расстоянием, на котором начинают появляться прибрежные волны, то нужно обратить на это внимание.
Если на сцене не будет ничего кроме ландшафта и плоскости, то "DistanceField" может вести себя немного странно. Но после того как на сцене появится еще какой-нибудь объект, содержащий "StaticMesh", все придет в норму.
Создание материала
Давайте создадим материал и назовем его "M_Surf". "Blend Mode" устанавливаем "Translucent".
Блок "SurfArea" - отвечает за размеры области прибоя и передает в функцию "MF_Surf" градиент, который меняется от нуля (граница появления волн) до единицы (береговая линия).
Параметры:
"Distance" - позволяет регулировать расстояние от берега, до границы появления волн (область прибоя)
"BaseColor" - задает цвет поверхности воды
"FoamColor" - задает цвет пены (волн)
"Opacity" - задает прозрачность материала
Функция "MF_Surf"
Содержит всю основную логику. На вход подается градиент, а на выходе получается система волн.
Блок "Global Noise"
Отвечает за глобальное искажение волн.
Параметры:
"GlobalNoiseScale" - отвечает за масштаб искажений
"GlobalNoisePower" - отвечает за силу искажений
Переключатель "UseGlobalNoise" - позволяет включать и отключать блок "GlobalNoise"
Узел "Noise" - позволяет настроить искажения
Блок "Time"
Отвечает за движение волн. Складывается с блоком "GlobalNoise" и подается на вход функций "MF_ForwardWaves" и "MF_ReverseWave". Параметр "WaveSpeed" позволяет регулировать скорость волн.
Блок "LocalNoise"
Отвечает за локальное искажение волн (пену и мелкие неоднородности).
Параметры:
"LocalNoiseScale" - отвечает за масштаб искажений
"LocalNoiseValueOffset" - отвечает за силу искажений
Переключатель "UseLocalNoise" - позволяет включать и отключать блок "LocalNoise"
Узел "Texture Sample" - позволяет выбрать текстуру, которая будет использоваться для локальных искажений. Сейчас выбран Perlin_Noise из стартового набора (Texture2D'/Game/StarterContent/Textures/T_Perlin_Noise_M.T_Perlin_Noise_M')
Функция "MF_CosineGradient"
Преобразует линейный градиент в кусок синусоиды, что позволяет получить более плавные переходы около нуля и единицы.
Функция "MF_ForwardWaves"
Создает волны, бегущие в сторону берега.
Блок "NumberOfWaves"
Параметр "NumberOfWaves" задает количество волн.
Узлы:
"1-x" - задает направление движения (волны бегут в сторону берега)
"Add" - добавляет глобальные искажения (блок "GlobalNoise") и изменение положения со временем (блок "Time")
Блок "ForwardWaves"
Вызывает функцию "MF_Waves" и задает параметры набегающих волн. Функция "MF_Waves" и ее входные параметры будут описаны ниже.
Переключатель "UseForwardWaves" - позволяет включать и отключать набегающие волны.
Функция "MF_ReverseWave"
Создает волну, бегущую от берега. Определяет размеры области, в которой эта волна распространяется, и вызывает функцию "MF_CoastLine", которая создает пену у самого берега.
Блок "ReverseWaveArea"
Определяет область в которой распространяется обратная волна. А также задает направление движения, добавляет глобальные искажения (блок "GlobalNoise") и изменение положения со временем (блок "Time").
Параметры:
"ReverseRelativeDistance" - определяет относительное расстояние (часть области прибоя), на которое будет распространяться обратная волна
"ReverseWaveTimeOffset" - позволяет изменять момент появления обратной волны. Если этот параметр равен нулю, то обратная волна появляется сразу после того, как набегающая волна ударилась о берег.
"ReverseWaveGradient" - определят, как быстро (на каком расстоянии от берега) исчезает обратная волна
Блок "ReverseWave"
Вызывает функцию "MF_Waves" и задает параметры обратной волны. Функция "MF_Waves" и ее входные параметры будут описаны ниже.
Переключатели:
"UseReverseWaves" - позволяет включать и отключать обратную волну
"UseCoastLine" - позволяет включать и отключать пену у берега.
Функция "MF_CoastLine"
Создает пену и движение воды у берега.
Блок "Time" отвечает за скорость изменения структуры пены рядом с берегом. Скорость регулируется параметром "CoastNoiseChangeSpeed".
Блок "CoastLineArea"
Определяет область образования пены и ее яркость.
Параметры:
"CoastLineGradient" - определят, как быстро (на каком расстоянии от берега) исчезает пена
"CoastPower" - определяет яркость пены
Блок "CoastNoise"
Отвечает за симуляцию пены.
Параметры:
"CoastNoiseScale" - определяет масштаб искажений
"CoastNoisePower" - определяет силу искажений (размытость границ)
"CoastLineValueOffset" - позволяет изменять контрастность
Блок "NoiseLoop" делает поведение пены периодическим.
Функция "MF_Waves"
Создает волны. Направление движения, количество волн и другие их характеристики определяются входными параметрами.
Входные параметры:
"WaveFrontRelativeWidth" - определяет, какую часть от волны занимает ее голова (передняя часть)
"WaveFrontPower" - определяет, насколько яркой будет передняя часть волны
"WaveBodyPower" - определяет, насколько яркой будет тело волны
"WaveFrontGradient" - определяет, насколько резко изменяется яркость передней части волны (четкость передней границы)
"WaveBodyGradient" - определяет, насколько резко изменяется яркость задней (основной) части волны
Блок "BaseWaves" превращает входной градиент (от "0" до n) в n градиентов от "0" до "1". Создает основу для волн. Если результат работы этого блока сразу передать на выход функции,
то получится следующая картина
Блок "Front"
Отвечает за переднюю часть волны (ее голову). Определяет ее размеры, яркость и размытость границ.
Блок "Body"
Отвечает за заднюю часть волны (ее тело). Определяет ее размеры, яркость и размытость границ.
Экземпляр материала (Material Instance)
Создаем экземпляр материала и применяем его к плоскости.
Для того чтобы был понятен масштаб, на сцену добавлены два персонажа.
Ниже приведены настройки, использованные в "Material Instance":
Заключение
А на сегодня это все. Спасибо за внимание.
Ссылка на видеоурок:









































































