Как современные игры делают уровень детализации геометрии для таких объектов, как персонажи, ландшафт и листва? На мой вопрос есть две части:
- Как выглядит конвейер активов? Делают ли художники высокополигональную модель, которую потом уничтожают? Если да, то какие алгоритмы прореживания наиболее популярны? Сетки LOD иногда делаются вручную?
- Как двигатели переходят между различными объектными LOD во время выполнения? Есть ли плавные или прогрессивные переходы?
Ответ может быть «разные студии используют разные методы». Если это так, пожалуйста, укажите некоторые из наиболее распространенных методов. Также было бы здорово, если бы вы указали мне на технические документы / слайды, которые охватывают конкретные примеры.
Ответы:
Для геометрии LOD большинство игр просто переключаются между несколькими предопределенными сетками LOD. Например, «Infamous: Second Son» использует 3 сетки LOD ( Адриан Бентли - «inFAMOUS: Посмертное состояние двигателя второго сына», GDC 2014 ), а «Killzone: Shadow Fall» использует 7 сеток LOD на персонажа ( Michal Valient - «Killzone: Shadow fall» демо посмертно ", Devstation2013 ). Большинство из них генерируются, но более важные (например, главный герой) могут быть сделаны вручную. Сетки часто создаются с использованием популярного промежуточного программного обеспечения Simplygon, но иногда они просто создаются графическими художниками в их любимом 3D-пакете.
В играх с большим расстоянием прорисовки дополнительно используются самозванцы для листвы, деревьев и высотных зданий ( Адриан Бентли - «Бедный после смерти двигателя второго сына», GDC 2014 ). Они также используют иерархические LOD, которые заменяют набор объектов одним. Например, в «Just Cause 2» деревья сначала визуализируются индивидуально как обычные LOD-сетки, затем индивидуально как самозванцы и, наконец, как единая объединенная лесная сетка ( Эмиль Перссон, Джоэль де Валь - «Заполнение массового игрового мира», Siggraph2013 ) и в Отдаленные части мира «Sunset Overdrive» заменяются одной автоматически созданной автономной сеткой ( Elan Ruskin - «Потоковый открытый мир Sunset Overdrive», GDC2015 ).
Другим компонентом системы LOD является упрощение материалов и шейдеров. Например, «Killzone: Shadow Fall» отключает касательное пространство и нормальное отображение для удаленных LOD ( Michal Valient - «Killzone: Shadow fall demo postmortem», Devstation2013 ). Обычно это реализуется путем глобального отключения набора функций шейдеров для каждого LOD, но для движков с графами шейдеров, где художники могут создавать собственные шейдеры, это необходимо сделать вручную.
Для переходов LOD некоторые игры просто переключают сетки, а некоторые используют сглаживание для плавных переходов LOD - при переключении LOD визуализируются две сетки: первая постепенно исчезает, а вторая исчезает ( Блог Саймона Шрайбта - «Assassins Creed 3 - LoD Blending» ). Классические методы прогрессивной сетки ЦП не используются, поскольку они требуют дорогостоящего обновления сетки и загрузки в графический процессор. Аппаратная тесселяция используется в нескольких заголовках, но только для уточнения самого подробного LOD, поскольку она медленная и в общем случае не может заменить предопределенные геометрические LOD.
Terrain LOD обрабатываются отдельно, чтобы использовать его специфические свойства. Геометрия ландшафта LOD обычно реализуется с использованием клип-карт ( Marcin Gollent - «Создание и рендеринг ландшафта в REDengine 3» ). Материалы LOD ландшафта либо обрабатываются аналогично сеткам LOD, либо используют какую-то виртуальную текстуру Ка Чен - «Адаптивный рендеринг виртуальных текстур в Far Cry 4» .
Наконец, если вам интересно увидеть реальные конвейеры игровых LOD, просто просмотрите документацию любого из современных игровых движков: Unreal Engine 4 - «Создание и использование LOD» , CryEgnine - статический LOD и Unity - LOD .
источник
LOD (уровень детализации) означает управление объектами в разных масштабах отображения, которые можно разделить на две части. Однако вы можете использовать один из них, и этого будет достаточно для большинства случаев.
Показать / скрыть слои (группы объектов одного типа) в зависимости от величины (масштаб отображения).
Метод, основанный на алгебраической геометрии, называется обобщением (это алгоритм для упрощения многоугольников). посмотрите на следующую картинку
Самый известный и эффективный метод обобщения (упрощения) многоугольной сетки известен как теорема Декарта-Эйлера (уравнение 4.5, извините, если я ссылаюсь на книгу, это было лучше, чем я могу сделать) и используется большинством пространственных баз данных. например модули PostGIS в PostgreSQL. Он просто удаляет меньшие стороны многоугольника и делает его очень округлым (рисунок выше).
Чтобы внедрить LOD в игру, вам нужно сохранять и управлять масштабом вашей карты (сцены) во время операций увеличения / уменьшения масштаба. Масштаб изменяется от нуля до бесконечности, и вы должны разделить это на определенное количество диапазонов, например что-то вроде этого:
Затем вам нужно определить, какие типы ваших объектов (слоев) должны быть видимыми или невидимыми в каждом из указанных диапазонов. Например, небольшой тип объекта, такой как клапан гидранта, не должен быть виден, когда пользователь находится в четвертом диапазоне, потому что он будет очень маленьким в этом масштабе и не может быть различим, поэтому не имеет значения, пропустите ли вы рисование на экран.
Поэтому, когда пользователь использует увеличение и уменьшение масштаба для изменения увеличения, он перемещается через вышеуказанные пределы от одного диапазона к другому, и ваша игра использует эти шкалы отображения для управления уровнем детализации, показывая или скрывая объекты на сцене. Это делает дискретное решение, что объекты внезапно исчезают во время вашей операции уменьшения масштаба, однако, если масштаб отображения и диапазоны увеличения определены тщательно, пользователь ничего не почувствует.
Вышеприведенная группа из 4 диапазонов является лишь примером, и вам нужно найти лучшее для вашего случая методом проб и ошибок. Для этого нет правила.
Иногда игры используют свои собственные методы LOD, Subway Surfer на мгновение, показывает маленький прямоугольник без текстуры, чтобы показать здание на большом расстоянии, и, когда он приближается внезапно, он получает текстуру, геймер чувствует это. Вы не говорили о своей проекционной системе, которая очень важна, и не говорили о том, какую игру вы создаете.
Однако предположим, что вы реализуете полную трехмерную игру с openGl и хотите отфильтровать некоторые сетки перед их переносом на графическое оборудование, и я уверен, что это поможет вам сократить операции связывания / открепления с буферными объектами и массивами вершин (VBO, VAO), пока дело с OpenGl.
В большинстве случаев нет необходимости реализовывать алгоритм обобщения, а фильтрация объектов просто работает и обеспечивает необходимую вам эффективность (частоту обновления), однако она полностью зависит от случая к случаю. Хотя это простой алгоритм, который просто удаляет маленькие стороны многоугольника, вам нужно определить порог, который является произведением величины и постоянного числа, чтобы большие стороны фильтровались в гораздо более отдаленной точке зрения.
Создание простейшего слоя управления и реализация только алгоритма обобщения Эйлера обеспечивает очень аккуратный и непрерывный метод, в котором вы просто проверяете каждую сторону и линии на соответствие заранее заданному порогу и показывает их только в том случае, если они достаточно велики, чтобы их можно было различить на экране.
PS: увеличение - это число с плавающей точкой> 0, которое равно 1 / шкала, а масштаб обычно <1, поскольку шкала 1: 1 означает, что в вашей игре есть длины реального мира.
источник
Иман уже подготовил полный ответ, но я хочу кое-что добавить к нему
LOD можно сделать двумя разными способами
Например, мипмапинг - хороший, быстрый, но тяжелый, который относится к второй группе выше.
здесь вы можете найти хорошее объяснение мипмапингу и реализации кода с помощью OpenGl.
источник