Войти
ПрограммированиеФорумГрафика

Quadtree mesh и корректный frustum culling (4 стр)

Страницы: 1 2 3 4 5 6 7 Следующая »
#45
(Правка: 12:33) 12:26, 17 сен 2022

Aslan
> Это плохая идея. Для стандартного монитора 16x9 площадь основания фрустума -
> 16*9=144, а площадь основания описанного вокруг фрустума конуса
> PI*(16^2+9^2)/2=529, убивает весь смысл frustum culling

Немного поразмыслив, подумал что я могу использовать 9 квадрантов, а не 4, поэтому все квадранты кроме центрального будут отсекаться идеально, даже с неточным отсечением. Поэтому всякие конусы не нужны вообще.
ezgif-1-2f970f5968 | Quadtree mesh и корректный frustum culling
ezgif-1-27982ab18b | Quadtree mesh и корректный frustum culling

ps единственное, это слетевшие швы надо переделывать для 3-х точек вместо 2х.

#46
12:34, 17 сен 2022

Kripto289
Как с дырками от разрыва лодов бъёшься? Куча статических мешей, динамически генерируешь, или шэйдерная магия?

#47
12:44, 17 сен 2022

Kripto289
Камера что только по горизонтали вертится?

Battle Angel Alita
Крайние вершины дисплэйсить одинаково, в зависимости расстояния ребра от камеры

#48
(Правка: 13:07) 13:03, 17 сен 2022

Battle Angel Alita
> Как с дырками от разрыва лодов бъёшься? Куча статических мешей, динамически
> генерируешь, или шэйдерная магия?
Ты имеешь в виду дырки от несовпадения вершин разных лодов?

+ Показать

Ну на гифках они слетели (надо использовать не 2, а 3 вершины теперь), и как раз щас это переделываю. А вообще алгоритм таков:
Стадия инициализации (1 раз при старте уровня):
1) при делении узлов дерева, я хеширую их индекс в таблицу
2) генерирую 14 вариантов квадрантов-мешей в зависимости от соседа (если быть точным то это просто массив вершин/треугольников).
На картинке разными цветами показал разные квандранты, а красным как они стыкуются.

+ Показать

Стадия обновления (каждый раз когда камера сдвигается/поворачивается на определенное расстояние/угол):
1) прохожу по дереву и собираю список видимых узлов
2) прохожу по списку видимых узлов, у каждого узла через хеш таблицу могу получить его соседей
верхний сосед = hash[x, y + 1],
нижний сосед = hash[x, y - 1]
и т.д.
А затем сравниваю уровни разделения у соседей и текущего узла, в зависимости от этого выбираю сгенерированный заранее меш (а точнее набор
3) генерирую из полученных мешей(массива треугольников/вершин) общий список треугольников/вершин и инициализирую из них меш.
Эта стадия пока что бутылочное горлышко. Можно разбросать по потокам все стадии кроме непосредственно инициализации меша. (в новой версии юнити анонсировали ещё более быструю инициализацию).
Ещё думаю как опцию добавить рендеринг отдельных мешей (без объединения в один). В таком случае можно избежать 3 стадии ценой ~100 drawcalls и некоторого оверхеда.

#49
13:07, 17 сен 2022

Aslan
> Камера что только по горизонтали вертится?
Нет, куда угодно. Просто лень было гифок столько пилить.
333 | Quadtree mesh и корректный frustum culling

#50
13:28, 17 сен 2022

Kripto289
> генерирую из полученных мешей
Не правильно ты бутерброд ешь. Надо через DrawMeshInstanced/DrawMeshInstancedProcedural используя один чанк(которая у тебя плашка 4*4) сразу всё море рисовать.

#51
(Правка: 13:49) 13:48, 17 сен 2022

Battle Angel Alita
> Не правильно ты бутерброд ешь. Надо через
> DrawMeshInstanced/DrawMeshInstancedProcedural используя один чанк(которая у
> тебя плашка 4*4) сразу всё море рисовать.
Не совсем понял про один чанк? Их же 14 видов, а значит (в худшем случае) придётся вызывать DrawMeshInstanced 14 раз?
Но да, я чё-то забыл про инстансинг. И это на самом деле самый идеальный вариант в таком случае. Ещё в таком случае можно отрисовывать сразу кучу разных систем воды, за те же 14 вызовов (пока вроде не превышу лимит инстансов?)

#52
14:20, 17 сен 2022

Короч кидаешь куда-нить в uv2 новый набор вертекс позишенов, смещённых так чтоб образовалось что-то типо как на картинке. Будет дегродировавшие треугольники, но это не страшно, оно на сборке всё равно выкинется. Потом передаёшь в инстанс с какой стороны разрывы (север/юг/запад/восток), потом в зависимости от стороны подлерпываешь uv2 набор координат к основному.
DegradeTriangles | Quadtree mesh и корректный frustum culling

#53
14:25, 17 сен 2022

Kripto289
> А какая разница между "частично попадает квад" или "полностью", если в любом
> случае нужно будет рекурсивно (или другим способом) пройтись дальше?
Ну полностью значит что все под квады тоже попадут/не попадут в фрустум.

А на кой тебе проходиться дальше по квадам, что уже 100% не попадут в фрустум?
Kripto289
> Проверяю квадрант верхнего уровня, если он виден, то проверяю его потомков
> рекурсивно.
А зачем проверять квад дальше если он целиком попал в фрустум?

Kripto289
> В смысле меш в виде пирамиды по фрустуму?
Всмысле делаешь как сейчас, раскрываешь квадтрее не оглядываясь на фрустум. Потом ненужное отсекаешь.

Kripto289
> Может скрины есть как это выглядит?
Конечно есть.
https://gamedev.ru/code/forum/?id=251508&page=2&m=5168770#m29

Aslan
> Лучше уж кубы описанными сферами - намного проще считать
Я так и делал.

#54
(Правка: 14:32) 14:32, 17 сен 2022

Kripto289
> Немного поразмыслив, подумал что я могу использовать 9 квадрантов, а не 4
Ага, только теперь ты будешь иметь проблемы с точностью флоата. А выйграл ты этим ничего. На твоём видео видно же что результат одинаковый как с квадами по 4 так и по 9. По 9 даже хуже будет, из-за более резкой смены лодов.

#55
14:35, 17 сен 2022

Battle Angel Alita
> Короч кидаешь куда-нить в uv2 новый набор вертекс позишенов, смещённых так чтоб
> образовалось что-то типо как на картинке. Будет дегродировавшие треугольники,
> но это не страшно, оно на сборке всё равно выкинется. Потом передаёшь в инстанс
> с какой стороны разрывы (север/юг/запад/восток), потом в зависимости от стороны
> подлерпываешь uv2 набор координат к основному.
Блин крутая идея.

#56
(Правка: 14:39) 14:36, 17 сен 2022

samrrr
> Aslan
> > Лучше уж кубы описанными сферами - намного проще считать
> Я так и делал.
Я тут пораскинула мозгами - сферы фигня, слишком большой радиус надо, слишко много пустоты по краям получается. Лучше 3 кружка по плоскостям xy xz zy, более плотненький охват получается.

Kripto289
> Блин крутая идея.
С тебя шавуха и двушка колы.

#57
14:41, 17 сен 2022

Battle Angel Alita
> Я тут пораскинула мозгами - сверы фигня, слишком большой радиус надо, слишко
> много пустоты по краям получается.
Ты видимо не понимаешь, беря сферу я сильно упрощаю логику отсечения и скорость рассчётов. +5-10% false-positive для меня приемлимая цена. Да и без отсечения фпс был нормуль.

#58
(Правка: 15:32) 15:28, 17 сен 2022

Kripto289
> генерирую 14 вариантов квадрантов-мешей в зависимости от соседа (если быть
> точным то это просто массив вершин/треугольников).
Жесть, 14х памяти и 14 раз генерировать, еще удивляешся откуда тормоза
Можно генерировать 14 вариантов каймы шириной в 2 вершины или по два варианта полоски в 2 вершины для каждого ребра или сразу генерировать один какой надо. Переходы между LODами сравнительно редкость и у тебя получается куча бесполезного мусора
Но если на GPU смещать вершины в vert shader, то вовсе никакой VBO ненужен

samrrr
> Я так и делал
Против фрустум?

#59
(Правка: 15:43) 15:40, 17 сен 2022

Aslan
> Жесть, 14х памяти и 14 раз генерировать, еще удивляешся откуда тормоза
14x памяти на сетку размером максимум 32 на 32? Пара тыщ векторов и индексов, это же жалкие копейки. Ну типо ~1мб данных на 14 таких массивов. На фоне остальных ресурсов игры это детский смех.
И почему 14 раз генерировать это проблема? Это при инициализации занимает жалкие наносекунды.
Или ты подумал что я генерирую для каждого узла? Тогда у меня памяти на компе не хватит.

Страницы: 1 2 3 4 5 6 7 Следующая »
ПрограммированиеФорумГрафика