Демистифицирует «кусочный уровень детализации»


17

Совсем недавно пытался разобраться в реализации частичной системы детализации в Unity. Я собираюсь сгенерировать четыре плоскости сетки, каждая с картой высот, но я думаю, что это не так уж важно в данный момент. У меня много вопросов после прочтения об этой технике, я надеюсь, что это не слишком много, чтобы задать все сразу, но я был бы чрезвычайно благодарен за то, чтобы кто-то помог мне разобраться в этой технике.

1 : я не могу понять, в какой точке конвейера LOD Chunked сетка разбивается на куски. Это во время начальной генерации сетки, или есть отдельный алгоритм, который делает это.

2 : Я понимаю, что структура данных Quadtree используется для хранения данных Chunked LOD , я думаю, что я немного упускаю точку, но хранит ли quadtree данные вершин и треугольников для каждого уровня подразделения?

3a : Как обычно рассчитывается расстояние до камеры? Когда вы читаете о квадри, очень часто упоминаются ограничивающие прямоугольники Оси. В этом случае у каждого куска будет ограничивающий прямоугольник столкновения, чтобы обнаружить камеру, или игрок поблизости? или есть лучший способ сделать это? (Raycast может быть?)

3b : Части сами рассчитывают расстояние до камеры?

4 : у каждого блока есть то же самое "разрешение". например, на верхнем уровне меш будет 32x32, каждый разделенный узел также будет 32x32. Пример ниже:

пример фрагментированного LOD


Если кто-нибудь знает лучший подход LOD для процедурной планеты, это также было бы интересно.
Гай Евгений

Я полагаю, вы уже посмотрели оригинальную статью SIGGRAPH Тэтчер Ульрих и связанную с ней программу? tulrich.com/geekstuff/chunklod.html
drxzcl

Я имею, это очень информативно до некоторой степени, но это не входит в тип детализации или подходов к реализации. Спасибо
Caius Евгений

1
Здесь есть несколько вариантов планетарного LOD; vterrain.org/LOD/spherical.html
OriginalDaemon

Ответы:


12

1: я не могу понять, в какой точке конвейера LOD Chunked сетка разбивается на куски. Это во время начальной генерации сетки, или есть отдельный алгоритм, который делает это.

Это неважно. Например, вы можете интегрировать блок в свой алгоритм генерации сетки. Вы можете даже сделать это динамически, так что более низкие уровни добавляются динамически (например, когда игрок приближается), используя подобный плазме алгоритм уточнения. Вы также можете сгенерировать сетку высокого разрешения из входных данных художника или данных измерений высоты и объединить их во все фрагменты LOD во время завершения актива. Или вы можете смешивать и сочетать. Это действительно зависит от вашего приложения.

2: Я понимаю, что структура данных Quadtree используется для хранения данных Chunked LOD, я думаю, что я немного упускаю точку, но хранит ли quadtree данные вершин и треугольников для каждого уровня подразделения?

Не обязательно. Дерево просто хранит информацию о геометрии и способах ее визуализации. Это может означать наличие списка вершин / граней на каждом узле дерева. Более реалистично в наше время, вы бы сохраняли дескрипторы мешей / экземпляров в памяти GPU.

3a: Как обычно рассчитывается расстояние до камеры? Когда вы читаете о квадри, очень часто упоминаются ограничивающие прямоугольники Оси. В этом случае у каждого куска будет ограничивающий прямоугольник столкновения, чтобы обнаружить камеру, или игрок поблизости? или есть лучший способ сделать это? (Raycast может быть?)

Очень дешевый и простой вариант - использовать расстояние до центральной точки куска, а затем исправить его. Вы знаете, что это расстояние всегда недооценивается: если центральная точка находится на расстоянии Z, это означает, что половина фрагмента ближе, чем эта. Однако мы не знаем, что такое ориентация. Если мы видим фрагмент шириной по wкраям, ближайший фрагмент будет на расстоянии Z-w. Однако, если мы просматриваем угол чанка первым, ближайший бит будет на расстоянии Z-sqrt(2)*w. Если вы можете жить с этой неопределенностью (вы почти всегда можете), все готово. Обратите внимание, что вы также можете исправить угол обзора, используя базовую тригонометрию.

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

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

3b: Части сами рассчитывают расстояние до камеры?

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

4: у каждого блока есть то же самое "разрешение". например, на верхнем уровне меш будет 32x32, каждый разделенный узел также будет 32x32.

Они не должны, но это удобно, если все куски занимают одинаковое количество места. Затем вы можете осуществлять управление памятью (GPU) в единицах «кусков». Также легче удалить / скрыть швы между двумя кусками разных размеров, если одно разрешение кратно другому, потому что они имеют больше вершин. (например, 32x32 и 64x64 легче управлять, чем 32x32 и 57x57) (спасибо Guiber!). Если у вас есть веская причина изменить размер геометрии куска, обязательно сделайте это.


2
Также легче удалить / скрыть швы между двумя кусками разных размеров, если одно разрешение кратно другому, потому что они имеют больше вершин. (например, 32x32 и 64x64 проще в управлении, чем 32x32 и 57x57)
Alayric 12.12.12

Блестящий ответ, это многое прояснило. В частности, большая часть реализации сводится к рассмотрению возможностей двигателя. С 3a я до сих пор не уверен, когда нужно запускать дистанционный запрос, две реализации, которые я считал достаточно загруженными CPU, я проведу еще несколько исследований по этому вопросу. Спасибо
Гай Евгений

1
@CaiusEugene: я думаю, что ты слишком обдумываешь свое определение расстояния. Я добавил очень дешевый, очень простой алгоритм к ответу в пункте 3а, который должен помочь вам начать.
drxzcl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.