Отдаленный рендеринг 3D объектов [игры]
Какова основная предпосылка технологии, такая как в Oblivion (я уверен, что в других играх недостаточно, чтобы знать), где объекты издали видны, когда вы смотрите на них на расстоянии? Например, большая башня находится в миле от вас, и вы видите расплывчатый прямоугольник, торчащий из-за горизонта... Очевидно, что гигантская трехмерная сцена не может быть воспроизведена полностью, и я знаю, что в случае карт высот есть только алгоритмы приближения которые используются для снижения качества карты высот еще дальше от камеры, но для конкретных объектов, как лучше всего это показать?
Возможно, я подумал о технике предварительного рендеринга, когда вы выбираете определенные места вокруг ландшафта, а затем создаете программу, которая рисует все карты высот и трехмерные модели вокруг этого места и делает снимок. Было бы сделано несколько снимков, а затем, когда проигрыватель находится рядом с этим местом, снимки будут использоваться в качестве скайбокса.
Другой, более очевидный способ - хранить действительно грубые 3D-модели, но как именно система 3D-рендеринга специально выбирает для визуализации грубую модель здания, а не грубые модели других менее значимых (и, вероятно, не видимых из-за-того? расстояние) объекты? Как бы вы сохранили что-то подобное вместе с картой высот? Может быть, по замыслу, иметь только несколько таких значимых ориентиров, а затем просто сохранить их список в небольшом файле, и на каждом кадре отобразить те, которые на самом деле меньше x?
Я знаю, что серия Halo выбирает разделить игру на уровни, и тогда на каждом уровне будет свой ручной скайбокс. Это то, к чему я стремился в первом предложении, но я не уверен в этом. Я думаю, что на самом деле я просто пытаюсь собрать другие идеи, усовершенствования или проблемы в моих идеях, чтобы я мог выбрать, какие из них создать прототип, используя мои ограниченные время и знания.
Еще одна связанная с этим тема - как отображать горы на расстоянии, так как они будут частью карты высот, а не 3D-моделей поверх нее, поэтому у них не будет возможности получить черновую версию, а алгоритм приближения карты высот может привести к ошибкам. подняться на гору с очень большого расстояния, как это (при условии, что вы даже попытаетесь приблизить и визуализировать такую отдаленную геометрию, которую вы, вероятно, не сделаете). Бонусные баллы, если вы также включите это в свой ответ.:)
Спасибо!
PS Я использую OpenGL. Я просто ищу основные понятия, но если вы решили опубликовать пример кода, пожалуйста, используйте функции и термины OpenGL!:)
РЕДАКТИРОВАТЬ: Спасибо за ответы! Для целей документирования здесь есть еще один ресурс: Глава 4.9 в Программирование игр Gems 2 охватывает концепцию рендеринга удаленных пейзажей в скайбокс: http://books.google.com/books?id=1-NfBElV97IC&lpg=PA416&ots=SOpnfijZly&dq=render%20distant%20to%20skybox&pg=PA416(к сожалению, предварительный просмотр - это только первая страница главы... Мне придется забрать эту книгу из библиотеки моего университета, как только я вернусь в августе)
Также, прочитав эти вещи, я все еще придерживаюсь мнения, что LOD предназначен для объектов, которые все еще находятся на достаточно близком расстоянии. Если объекты имеют размер не более одного пикселя, но вы по-прежнему подаете их на видеокарту, вы просто теряете энергию, независимо от того, используете ли вы LOD или нет. И это относится ко всему, кроме самых больших отдаленных объектов; несколько высоких зданий и горы, в большинстве случаев, но маленькие модели деталей (кусты, даже деревья, камни, любые другие пейзажи...) не были бы видны с такого расстояния. Поэтому мне нравится техника рендеринга в скайбокс, и когда я доберусь до этого моста, вот как я перейду его; и я обязательно использую LOD для всех моделей, я просто не буду отображать такое расстояние.
Кстати, я больше думаю о том, что происходит в игре Oblivion, поэтому ответ может зависеть от жанра игры.
8 ответов
Несколько методов, в том числе те, которые вы упомянули:
- Уровень детализации. Изложено выше.
- Мипмаппинг. Для текстур.
- Поле зрения. Ограничьте количество вещей, которые может видеть ваша камера, выбрав соответствующий уровень масштабирования. Смотрите также просмотр выбраковки.
- Дальний отсечение самолета. Окклюзия далеких мест: в большинстве игр используется туман, горы или какое-либо другое оправдание, чтобы жестко обрезать то, как далеко вы можете видеть. Это может быть реализовано с использованием октод или другого подобного метода. Это может быть основано на целых объектах, или многоугольниках, или на чем-то другом, и обычно устанавливается прямо за этими вышеупомянутыми горами.
- Арены / уровни / области / что угодно - опять же большинство игр искусственно ограничивают вас игрой на одной арене одновременно; выгода очевидна (вы можете игнорировать объекты на всех других аренах)
- Предварительный рендеринг - это то, что вы предлагаете выше. Для статических сцен, которые находятся далеко, визуализируйте сцену в "типичном" виде и сделайте ее текстурой на фоне, или используйте ее для карты неба / отражения / и т. Д.
Идея состоит в том, чтобы отбросить как можно больше деталей, прежде чем пользователи начнут замечать.
Существует ряд уже существующих наборов инструментов, которые будут выполнять эти действия автоматически, но они, как правило, стоят денег. Если вы ищете серьезное приложение, я бы рекомендовал хотя бы изучить решения, которые они включают.
Для 3d моделей техника называется уровнем детализации. По сути, модели с несколькими версиями остаются доступными для правильного использования в зависимости от контекста. Это не всегда только для расстояния, оно также может использоваться для поддержания частоты кадров в других ситуациях.
Однако будьте осторожны, у вас должно быть включено mipmapping, иначе вы получите блестящие текстуры большего размера на моделях с низким разрешением и будьте осторожны с анимацией. Переключение модели под анимирующим скелетом довольно сложно, поэтому одним из методов является поддержание того же скелета даже во время LOD-модели.
Существуют динамические системы LOD как для рельефа местности, так и для объектных моделей, но они могут сильно загружать процессор.
Техника динамического кэширования предварительно визуализированных представлений удаленных объектов обычно называется "самозванцами". Вот статья из старой книги Gems Programming Gems на эту тему.
Есть много методов для обработки уровня детализации для карты высот местности. Взгляните на vterrain.org для обзора некоторых распространенных методов. Общий принцип одинаков в большинстве вариантов - разбить местность на участки и использовать геометрию с меньшим разрешением и текстуры на расстоянии - но детали различаются.
Чтобы уменьшить количество объектов, которые отправляются на видеокарту, обычно будет реализован какой-либо вид отбора. В самом простом случае это может быть просто полное отбрасывание моделей, ограничивающая сфера которых покрывает меньше определенного порога пикселей экрана (вы все равно будете это вычислять, выбирая, какой LOD использовать, если у вас есть система LOD). Для большей эффективности можно использовать некую иерархическую структуру пространственных данных для отбраковки - квадродерево или октдерево, сферические деревья, портальные системы (обычно не очень используемые для наружной среды), простые схемы на основе сетки и т. Д. Основная идея состоит в том, чтобы сохранить работу отбирая узел более высокого уровня в иерархии и, таким образом, избегая даже просмотра множества конечных узлов. Простым примером будет отбраковка здания и эффективный отбор всех его дочерних узлов (объектов внутри или сверху здания), не рассматривая их по отдельности.
В такой игре, как забвение, они, вероятно, также делают какие-то действия по выбраковке-окклюзии, прежде чем отправлять их графическому оборудованию, основываясь на том, что они скрыты за другими объектами. Для этого существует множество методов, некоторые из них могут быть довольно сложными.
Модели с низким уровнем детализации работают особенно хорошо для транспортных средств и объектов. Это действительно сложно с ландшафтом. Я работал над играми типа зоны боевых действий и компьютерными симуляторами полета. Небольшой туман помогает скрыть "треск" между деталями.
В более низких деталях наложение текстуры часто заменяется несколькими одноцветными полигонами.
"Еще один более очевидный метод - хранить действительно грубые 3D-модели, но как именно система 3D-рендеринга специально выбирает для визуализации грубую модель здания, а не грубые модели других менее значимых (и, вероятно, не видимых из-за этого" объекты)? Как бы вы хранили что-то подобное вместе с картой высот?"
Вы можете создать сетку своей местности и вести список объектов, которые видны в каждой ячейке сетки.
Одним из методов является LOD (уровень детализации). Чем дальше объект от камеры, тем меньше треугольников нарисовано. Вот ссылка: http://www.stefan-krause.com/
Одним из способов обработки ландшафта является использование плиток с несколькими разрешениями. Подобно тому, как это делают Virtual Earth и Google Maps, они рекурсивно делят мир на плитки. Итак, есть 4 плитки на уровне 0, 16 на уровне 1 и т. Д. Затем, используя некоторый алгоритм LoD для определения масштаба / масштаба, вы загрузите соответствующие плитки местности для данной области.
Вы можете выполнять рендеринг в текстуры для удаленных объектов, однако вам придется делать рендеринг текстуры каждый раз, когда перспектива изменяется за пределами определенного порога. Он отлично работает для удаленных объектов, где перспектива не изменится, как это часто бывает на примере гор на расстоянии, однако, если источник обзора движется слишком быстро или вы находитесь слишком близко, вы получите эффект "рыбий глаз" вроде первые дни рендеринга неба в землетрясении. Такая система предоставляет себя мирам, таким как канун онлайн, которые содержат огромные расстояния.
Это, конечно, еще один трюк в вашем арсенале, и вам все равно понадобится LOD в некоторой степени.