Войти
ПрограммированиеФорумОбщее

Нужна помощь с волнами от падения объектов

Страницы: 1 2 Следующая »
#0
(Правка: 18:14) 18:03, 29 июля 2021

Привет всем!
Случилась большая беда. Нужно сделать волны брызги и все, что требуется чтобы падение обьекта в воду выглядело реалистично.
В игре с видом от 1-го лица есть резервуары с водой и игрок может кидать в них обьекты. Сам может прыгнуть в резервуар. Обьекты могут падать в резервуары с разной силой. А еще игрок может водить обьектами по поверхности как хочет. Думаю понятно как должны выглядеть волны.

Вообще, в воду будет падать 2 типа объектов: кубы и шары. Но для упрощения шары не буду рассматривать. Пусть с водой взаимодействуют только кубы.
В чем проблема: у меня нет опыта работы с волнами/брызгами. Нет даже представления о том как оптимальнее и лучше сделать волны. Брызги можно сделать системой частиц. Можно еще меш с текстурой брызгов как-то сделать и с брызгами вроде еще можно справиться. Но а как быть с волнами? Как делают волны?

Здесть видео примера того как должны выглядеть волны. А здесь картинки с примерами волн:

+ Показать
+ Показать

Использовать готовый ассет не могу так как у меня своя вода (стилизованная). Да и не знаю, подойдет он или нет. Может из него можно использовать какой-то код, хотя не знаю.
Ребят, посоветуйте как лучше сделать волны.


#1
18:14, 29 июля 2021

> Случилась большая беда
Ты преувеличиваешь.

Через сеточный метод это можно сделать, как описано в http://www.gamedev.ru/code/articles/?id=4205
Он же используется в древней демке в Огре https://youtu.be/Rk6b56_MAio?t=149

#2
18:29, 29 июля 2021

http://www.3dcpptutorials.sk/index.php?id=48
Можешь сделать как тут

#3
(Правка: 19:39) 17:16, 3 авг. 2021

Ребят, сделал волны:
-- | Нужна помощь с волнами от падения объектов

Вроде все устраивает кроме производительности, гора полигонов.
Чтобы волны красиво анимировались, требуется высокополигональная модель плосткости.
У меня в игре кроме воды есть еще много чего, так что рендерить океан из 100500 полигонов и помещения одновременно - очень напряжно. Да что там, просто воду до горизонта рендерить затратно.
Потому хотел бы узнать о том как можно оптимизировать рендер воды. Вижу 3 решения:
1) не рендерить много воды
НЕДОСТАТОК : не подходит
2) сделать большум модель-плоскость с отверстием под волны и рендерить 2 обьекта.
НЕДОСТАТОК : придется двигать модели воды и воды с поддержкой волн так, чтобы волны появлялись там, куда упал обьект. Эта система весьма ограничена. Не получится ОДНОВРЕМЕННО кидать обьекты в разные части воды.
3) Тесселяция. Точно не знаю, но догадываюсь, что это должно помочь. Возможно ли увеличить полигональность воды в зависимости от маски? Например на основе маски волн? Никому не попадался проект с тесселяцией, который можно адаптировать под эту задачу???

Ребят, как бы вы посоветовали оптимизировать волны? Какие еще подводные камни могут встретиться?

#4
(Правка: 20:33) 20:32, 3 авг. 2021

Самая быстрая вода - Нормали + DuDv карта + Кубмап + Тесселяция. Волны от падения отдельной картой (можно бапмом, генерится каждый кадр). Волны можно на крупной полигональной сетке + sin/cos (см.  GPU Gems 1). Под углом 45 и больше будет норм. Не будет заметно, что всё плоское.

#5
22:01, 3 авг. 2021

lookid
> Не будет заметно, что всё плоское.

В моем случае волны будут хорошо видны, то есть нужны неплоские волны.
На данный момент система каждый кадр решает уравнение и генерирует волны:
- по карте высот создается карта нормалей
- по карте высот вычисляется высота волны и значение подается в вертексный шейдер

Если модель воды высокополигональная, то все хорошо, волны еще приемлимы
Если полигонов мало, то почти нечего двигать.

Я полез в тесселяцию. Нашел примеры тесселяции на catlikecoding. Но вот что-то не могу понять как работает тесселяция.
Как работает-то я в общих чертах понял, но мне непонятно одно: нельзя заменить всю плоскость воды на 1 меш с 4-я вершинами и тесселировать его??? Похоже что нет или я не понял как можно тесселировать квад так чтобы полигоны создавались не так как тут:
-- | Нужна помощь с волнами от падения объектов
(one quad)

А как тут:
- | Нужна помощь с волнами от падения объектов
(a few quads)

На втором скрине тесселируется Plane. В этом случае модель уже побита на крупные полигоны, которые еще делятся тесселяцией. Так вот, возможно ли не использовать Quad так, чтобы он тесселировался как Plane. Если нет, то как быть? Тогда модель воды все равно будет содержать кучу полигонов...

#6
22:11, 3 авг. 2021

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

#7
22:46, 3 авг. 2021

lookid
Спасибо!
Посмотрел статью, меня как раз очень интересует раздел : "Rendering Heightmap Efficiently with Continuous LOD".
Подскажите пожалуйса что такое "continous LOD heightmaps"?
Написано, что это "патчи", которые делятся в зависимости от дистанции до камеры. Патчи, в смысле это отдельные GameObject c LOD ???
То есть в память подгружаются нужные плоскости воды (работают Occlusion & Frustum), потом работает LOD и выбирается нужный уровень детализации, верно???

#8
23:04, 3 авг. 2021

Alerr
https://github.com/Syllvan/CDLOD
Это ноды. В них одинаковая вода. Чтоб вода не была одинаковая еще сверху делают шум.

#9
(Правка: 11:46) 11:32, 4 авг. 2021

lookid
Спасибо!

Сейчас швы на стыках разных обьектов пытаюсь скрыть. Выходит что у меня много моделей воды с разными lod.
Когда лоды переключается, то видны швы.

Нужно сделать так, чтобы тесселяция сводила на 0 возмущение волн вдали (в области стыков разных lod).
Профи юнити, есть ли возможность задать свой domain метод в surf шейдере???
Проблемно переписывать surf в фрагментный шейдер.

#10
13:20, 4 авг. 2021

Наконец сделал тесселяцию и убрал стыки на соединениях разных "вод": видео


lookid
Сейчас вода представляет из себя набор обьектов с разными LOD.
Можно задать UV всем этми лодам так чтобы на них на все накладывалась текстура в которой содержится информация о выстоте волн от падения обьекта. Но эта текстура, очевидно, должна быть огромной. Особенно если воды много и нужно выдавать хорошее разрешение в области где есть волны.

Не знаю как лучше сделать, вернее как оптимальнее
-вешать на всю воду одну большую текстуру (затратно для перепросчета карты высот)
-располагать маленькую тектсуру там, где есть волны

Очевидно, все зависит от игры, от "размеров" воды; Допустим у меня что-то типа Витнеса. То есть воды много. В этом случае посоветовали бы вы проецировать маленькую текстуру на часть меша воды? Или есть какой-то другой подход?

#11
13:42, 4 авг. 2021

Alerr
Ты хочешь волны на соседние ноды. Тогда можешь посчитать заранее возможный радиус всплесков и взять в оборот только те ноды, что нужны.

#12
16:04, 4 авг. 2021

Alerr
> Ребят, сделал волны:
Лучше бы видео сразу кидал. Поинформативней, чем скрины.

#13
0:04, 5 авг. 2021

Alerr
Посмотри как реализован меш воды вот в этом ассете(можно найти в инете).
https://assetstore.unity.com/packages/tools/particles-effects/aqu… ver-set-52103
Очень интересная реализация. Вода рендерится из одного прямоугольника с заданным количеством полигонов. Но этот прямоугольник "растягивается" в зависимости от направления вида камеры. Сам шейдер воды там конечно накручен, что трындец, но принцип репроекции позиции вертексов основного квада подсомтреть можно без проблем.

#14
10:25, 5 авг. 2021

marggob
можно еще воду из DX11 Demo взять, что уж тут.

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее