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

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

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

samrrr
это просто юбки, при отрисовке заливкой они не видны

#76
1:46, 18 сен 2022

Ivashka
> это просто юбки, при отрисовке заливкой они не видны
А вот в правильном алогритме такого безобразия нет.

#77
9:23, 18 сен 2022

samrrr
А ты как сделал?

#78
10:08, 18 сен 2022

Kripto289
> 1) при делении узлов дерева, я хеширую их индекс в таблицу
> 2) генерирую 14 вариантов квадрантов-мешей в зависимости от соседа (если быть
> точным то это просто массив вершин/треугольников).
зачем таблица?
зачем меши? Жесть, тебе нужен один общий 16 битный индексный буфер в котором будет список индексов все лодов + индексы стягивающих полигонов закрывающих разрыв между лодмами.
Хранишь индексы патчей для лода и индексы стягивающих полигонов должны лежать последовательно что-бы рисовать нужный лод + стяжку если нужно.
Kripto289
> 3) генерирую из полученных мешей(массива треугольников/вершин) общий список
> треугольников/вершин и инициализирую из них меш.
> Эта стадия пока что бутылочное горлышко. Можно разбросать по потокам все стадии
> кроме непосредственно инициализации меша. (в новой версии юнити анонсировали
> ещё более быструю инициализацию).
> Ещё думаю как опцию добавить рендеринг отдельных мешей (без объединения в
> один). В таком случае можно избежать 3 стадии ценой ~100 drawcalls и некоторого
> оверхеда.
а теберь вместо этого дикой жести нужно по квадрату расстоняия от камеры выбирать нужный LOD и по смещению в общем IB рисовать патч вместе с стягивающими индексами, если  они нужны

Итого, никаких динамический вершинных буферов, никаких генерация мешей никаких потоков. на CPU 1 проверка на квадрат растсстояния(мона покруче задать выбор лода) и 1 DIP на патч.

Все это я делал когда быд маленький, теперь сделал тесселляцию, потом дорос до кулинга и отриcоки через MDI за 1 Вызов + отрисовкой без VB(чтение из HeightMap в Hull Shader, DomainShader)), без ненужного quadtree и генерацией 16 вариантов индексного буфера.

Следущий шаг это Mesh Shaders.

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

> Просто из 100 таких массивов я собираю один общий тупым копированием элементов.
> Для небольших сеток и минимальным набором lod это должно быть очень быстро. Но
> мне нравится вариант вообще отказаться от VBO и инстансингом всё рисовать.

...

#79
11:57, 18 сен 2022

Andrey
> без ненужного quadtree
А lod-ы как строишь?

#80
12:02, 18 сен 2022

Aslan
> А ты как сделал?
У меня принципиально другой алгоритм. А как правильно ты можешь нагуглить.

#81
12:09, 18 сен 2022

samrrr
Откуда мы знаем, что ты считаешь правильным

#82
(Правка: 13:39) 13:39, 18 сен 2022

Aslan
> Откуда мы знаем, что ты считаешь правильным
Ну так нагугли хоть что-то. Если будут сомнения скинешь ссылку.

#83
15:02, 18 сен 2022

samrrr
Зачем мне гуглить, если я своим умом сделал, как надо
А от тебя, вижу, толку не добьешся

#84
16:05, 18 сен 2022

Aslan
> Зачем мне гуглить, если я своим умом сделал, как надо
Ну если тебя результат устраивает, это ещё не значит что ты сделал как надо.
Aslan
> А от тебя, вижу, толку не добьешся
Конечно, смысла нет что-то объяснять человеку, который нестал даже гуглить.

#85
(Правка: 16:28) 16:25, 18 сен 2022

Andrey
> зачем таблица?
> Жесть, тебе нужен один общий 16 битный индексный буфер в котором
> будет список индексов все лодов + индексы стягивающих полигонов закрывающих
> разрыв между лодмами.
> Хранишь индексы патчей для лода и индексы стягивающих полигонов должны лежать
> последовательно что-бы рисовать нужный лод + стяжку если нужно.
Не понимаю в чём принципиальная разница.
Допустим у меня есть узел, который хранит в себе индекс.

 public class Node
        {
.....
            public Vector2Int UV;
}

При создании нода я преобразую его позицию в индекс и записываю в массив всех индексов.

  Vector2Int PositionToUV(Vector3 pos, Vector3 quadSize, int chunksCount)
        {
            var uv = new Vector2(pos.x / quadSize.x, pos.z / quadSize.z); //range [-1.0 - 1.0]
            return new Vector2Int((int)((uv.x * 0.5f + 0.5f) * chunksCount), (int)((uv.y * 0.5f + 0.5f) * chunksCount));
        }
...
indexBuffer = new Node[chunksCounts, chunksCounts];
....
var node = new Node();
....
var uv = PositionToUV(chunkPos, size, chunksCount);
indexBuffer[uv.x, uv.y] = node;

Ну типо я легко могу получить 4-х соседей узла используя этот код

var up = indexBuffer[node.UV.x, node.UV.y + 1];
var down = indexBuffer[node.UV.x, node.UV.y - 1];
var left = indexBuffer[node.UV.x - 1, node.UV.y];
var right = indexBuffer[node.UV.x + 1, node.UV.y];

Код простой, сложность алгоритма O(1), так и почему это "жесть"?

Andrey
> зачем меши?
> Жесть
Да не храню я меши. Это просто список вершин/индексов максимум 32 x 32. И таких chunksData всего 14 штук.

        public class ChunkData
        {
            public List<Vector3> vertices;
            public List<int>     triangles;
        }

Andrey
> а теберь вместо этого дикой жести нужно по квадрату расстоняия от камеры
> выбирать нужный LOD

Господи, да у и так lod выбирается по расстоянию. Я же сделал несколько гифок.

 public bool UpdateVisibleNodes(List<Node> visibleNodes, Vector3 camPos, Plane[] frustumPlanes, Vector3[] frustumCorners)
            {
                if (!IsBoxVisible(frustumPlanes, frustumCorners, Bounds, camPos)) return false;
                if ((Bounds.center - camPos).magnitude > LodDistances[CurrentLevel]) return false;
....  
            }


Andrey
> Итого, никаких динамический вершинных буферов, никаких генерация мешей никаких
> потоков. на CPU 1 проверка на квадрат растсстояния(мона покруче задать выбор
> лода) и 1 DIP на патч.
Так я же несколько раз уже написал, что в дальнейшем буду рендерить меши через инстансинг без буферов и генерации. В чём возмущение то? В том что моя вода пока работает без инстансинга и я просто не написал для этого код?

Andrey
> теперь сделал тесселляцию, потом дорос до кулинга и отриcоки через MDI за 1
> Вызов + отрисовкой без VB(чтение из HeightMap в Hull Shader, DomainShader)),
> без ненужного quadtree и генерацией 16 вариантов индексного буфера.
Всё это отлично, но если почитать мои сообщения, то я ясно дал понять что тесселяция с culling-ом и hull shaders/domain shader у меня сейчас используются, но я хочу альтернативный метод.
Потому что:
1) не работают на metal API (потому что там нет тесселяции и hullshaders/domain shader) и всё это эмулируется через compute shaders. Вся эта магия только одним разработчикам юнити известна, поэтому тесселяция там может отвалиться по любому чиху. Например в моём случае она отваливается если я пытаюсь передать что-то кроме позиции вершин, например нормаль или uv.
2) на vulcan тесселяция не работает из-за внутреннего бага юнити, а фикс подвезли только в ранних альфа билдах.
3) тесселяция на мобилках очень медленная и вообще GPU почти всегда узкое место в большинстве игр. Так почему бы не разгрузить видеочип и не использовать quadtree? Один фиг CPU за редким исключением являются узким местом. Особенно если код исполнять в многопотоке.

Andrey
> Следущий шаг это Mesh Shaders.
Да, только если apple разродится его добавить, как и vulcan, а мобильные драйверописатели сделает mesh shaders не для галочки.

#86
16:37, 18 сен 2022

samrrr
Ты тут ничего никому и не обьяснял, просто кинул фразу, что будто бы знаешь "как надо"

#87
17:42, 18 сен 2022

Aslan
> Ты тут ничего никому и не обьяснял
И не обязан объяснять.

Aslan
> просто кинул фразу, что будто бы знаешь "как надо"
Ну я же воспользовался гуглом, изучал вопрос, и видел как надо.

Если ты думаешь, что на слабо я расскажу ссылку нужную, то ты ошибаешься. Это так не работает. Не хочешь искать в гугле не ищи, для тебя и твой результат норм. А сказал я это чтоб кто-то другой кто посмотрит на это не решил, что так и нужно делать.

#88
17:54, 18 сен 2022

samrrr
> Ну я же воспользовался гуглом, изучал вопрос, и видел как надо
Ясно

#89
21:32, 18 сен 2022

Aslan
> А lod-ы как строишь?
прореженный индекс буфер для патча ландшафта, каждый лод это в 4 ращза меньше  полигонов.
Kripto289
> Да не храню я меши. Это просто список вершин/индексов максимум 32 x 32.
Ну достаточно индексного буфера, в этой реализации
Kripto289
> Да, только если apple разродится его добавить, как и vulcan, а мобильные
> драйверописатели сделает mesh shaders не для галочки.
Metal 3 поддерживает Mesh Shaders. в Vulkan несколько дней назад EXT добавили.

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