Ocean Waves Normals

Использование world position (из вершинного шейдера) является популярным способом создания волн океана в UE3/UE4. Однако есть недостаток, который заключается в том, что деформированая геометрия не имеет правильного затенения/shading -а. Для его устранения приходится вручную внутри материала вычислять новые нормали объекта.
Для этого необходимо вычислить производные той же функции, которая используется для формирования морских волн. Производные по X и Y эквивалентны красному и зеленому каналу карт нормалей. Учитывая 2 этих компонента, можно вычислить недостающий 3-й компонент.
Я хорошо знаю что есть много способов реализации движения океана, но я решил показать лишь один подход с 2 подтипами, направленные волны и круговые.
В реалистичном материале океана, как правило сочетают несколько волн разного размера, скорости, направления/положения. Это обозначает что вам необходимо будет дублировать некоторые ноды показанные в этой статье. Лично я бы не стал расчитывать материал на более 3-4 волн, чтобы сохранить общую сложность материала.
Настройки материала ниже, будут работать только если параметр «Tangent Space Normal» деактивирован в свойствах материала. Это связано с тем, что все вычисления будут сделаны в мировом пространстве, что означает что мы получим мировые карты нормалей (World space normal/Object space normal). Однако если вы хотите использовать именно Tangent space карты нормалей, вам необходимо будет сделать преобразование результата из World space пространства в Tangent space.
Направленные волны:

Image

[свернуть]
Направленные волны, основаны на скалярном произведении между мировым положением каждого пикселя, и вектором мирового направления. Это скалярное произведение добавляется к времени, а затем подается в ноду Sine, чтобы перемещать вершины (vertex-ы) вдоль z оси.
Image

[свернуть]
Генерация карт нормалей, для направленных волн выглядит довольно легко. Sine нода заменяется на Cosine, а затем умножается на X и Y компоненты.
В приведенном ниже примере вы можете увидеть, что интенсивность нормалей, автоматически рассчитывается, путем сравнения длинны и высоты волны.
Image

[свернуть]

Круговые волны

Image

[свернуть]
Круговые волны определяются точкой происхождения и расстояния между этим происхождением и мировой позицией. Подобно направленным волнам, это расстояние добавляется к времени, а затем подключается к Sine ноде. Выглядит это так:
Image

[свернуть]
Настройка материала для вычисления нормалей, немного более сложная, так как нода расстояния включает в себя квадратные корень (square root)
Image

[свернуть]

Original page


Читайте также: