Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Простым языком про оптимизацию 3D-графики. Как художники и разработчики видеоигр добиваются лучшего качества изображения при минимальных затратах системных ресурсов. Разберём ключевые принципы оптимизации и технологии, которые лежат в их основе.

Процесс оптимизации включает множество методов: от упрощения геометрии моделей до алгоритмов обработки текстур, освещения и теней. Оптимизация важна не только при разработке видеоигр, но также при работе с виртуальной реальностью, архитектурной визуализацией и созданием визуальных эффектов.

Основные принципы оптимизации 3D-графики

Эффективная работа с 3D-графикой начинается с понимания того, как системы обработки данных, такие как GPU и CPU, справляются с рендерингом сложных сцен. Визуализация каждого объекта, будь то персонаж или окружение, создают нагрузку на систему. Чем сложнее сцена, тем больше ресурсов требуется для её обработки. Возникает вопрос: какую роль играет GPU и CPU в рендеринге?

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

GPU (графический процессор) — основной инструмент обработки графики. Через него проходят огромные объёмы данных, связанных с геометрией, текстурами и освещением в 3D-сцене.

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

Нерациональное распределение нагрузки между этими двумя компонентами системы снижает производительность. Каждый 3D-объект состоит из множества полигонов — чем их больше, тем сложнее обработка. Для рендеринга сложных моделей нужно мощное оборудование, а также грамотное использование ресурсов. На помощь приходят методы оптимизации, которые позволяют уменьшить количество полигонов, сохранив при этом визуальное качество.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Снижение количества полигонов

Когда создаётся high poly* модель методом скульптинга или моделированием, например, под Sub-D**, она зачастую состоит из множества полигонов. Такое количество полигонов подходит для детализированного рендера или создания карт нормалей. Но совершенно неприменимо для какой-либо работы с ней, будь то в играх или анимациях. Высокая сложность геометрии требует огромных вычислительных ресурсов, что делает такие модели практически неприменимыми в реальных проектах.

* High Poly — модели с большим количеством полигонов, которые используются для передачи мельчайших деталей. Они нужны для создания текстур и фотореалистичных рендеров. Из-за высокой нагрузки на GPU такие модели нельзя использовать в реальном времени. Поэтому после создания модели high poly всегда следует этап оптимизации.

** Subdivision Surface (Sub-D) — метод сглаживания геометрии, при котором каждый полигон делится на более мелкие, а форма модели становится более плавной. Моделирование под Sub-D предполагает создание упрощённой базовой формы — low poly, которая затем сглаживается, чтобы получить детализированную high poly модель.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов
Сверху без sub-d / Снизу с sub-d
Сверху без sub-d / Снизу с sub-d

Чтобы сделать модель из миллионов полигонов пригодной для использования, специалисты используют ретопологию.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Топология — это то, как именно полигоны формируют 3D-модель. Расположение многоугольников, создающее некоторый путь по поверхности полигональной сетки.

Ретопология — процесс создания новой топологии модели с меньшим количеством полигонов, сохраняя её общий внешний вид и форму.

Ретопология позволяет:

  • Уменьшить нагрузку на систему. Чем сложнее геометрия модели, тем больше ресурсов требуется для её обработки. Упрощение топологии уменьшает нагрузку на GPU.
  • Улучшить управление текстурами и UV-развёрткой. Хорошая топология упрощает процесс создания качественных текстур и их равномерного распределения по поверхности модели.
  • Обеспечить стабильную анимацию. Хорошая сетка важна для моделей, которые в будущем будут анимироваться.

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

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Автоматический метод подразумевает использование плагинов. Например, ZRemesher в ZBrush, Decimate в Blender и других. Эти инструменты сокращают количество полигонов программно, но зачастую работают не очень хорошо и всё равно требуют ручной доработки.

Основные правила топологии:

  • Не использовать длинные и узкие полигоны. Они вызывают проблемы при текстурировании и рендеринге. Предпочтение отдаётся более равномерным треугольникам или квадратам, что упрощает вычисления.
  • Устранить лишние соединения. Стоит удалить невидимые части модели и избыточные детали, которые не влияют на её внешний вид.
  • Оптимизировать геометрию для сглаживания. В местах, где детализация не критична, уменьшить плотность сетки. А в ключевых зонах, таких как лицо персонажа, сохранить дополнительные полигоны.

Уровни детализации — LOD

Для оптимизации моделей в видеоиграх используется система LOD (Levels of Detail). Она позволяет изменять детализацию объектов в зависимости от их расстояния до игрока.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

LOD 0 — ближние объекты: самая детализированная версия модели. Используется для объектов, находящихся вблизи игрока.

LOD 1, LOD 2 и далее — удалённые объекты: версии модели с меньшим количеством полигонов и упрощёнными текстурами. На больших расстояниях игрок не замечает мелких деталей, поэтому их просто удаляют для повышения производительности.

LOD последнего уровня: это может быть даже простая геометрическая фигура, такая как куб или плоская текстура, чтобы обозначить объект на горизонте.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Каждый LOD или создаётся вручную, чтобы сохранить важные детали, или создаётся автоматически с помощью программ Simplygon, LOD Generator в Unreal Engine и других.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

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

Использование нормалей и карт высот

Чтобы создать впечатление сложной поверхности у модели, не увеличивая количество полигонов, используются различные текстуры. Например, карты нормалей* или высот.

* Карта нормалей (Normal Map) — текстура, которая имитирует мелкие детали, такие как складки, трещины и выпуклости за счёт направления света. Вместо того чтобы добавлять физические полигоны, световые эффекты создают иллюзию глубины. Такие текстуры экономят ресурсы, заменяя миллионы полигонов на легковесные карты, которые создают практически такой же визуальный эффект.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов
Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Преимущества использования карт нормалей и высот:

  • Уменьшение количества полигонов: вместо высокой детализации модели используются текстуры.
  • Повышение производительности: карты занимают меньше памяти, чем дополнительные полигоны.
  • Детализация: создаётся впечатление, что модель имеет гораздо больше деталей, чем есть на самом деле.
Low poly / Low poly с Normal map / High poly
Low poly / Low poly с Normal map / High poly

Оптимизация топологии сетки и использование карт нормалей или высот — базовые, но мощные инструменты, которые позволяют разработчикам создавать визуально сложные сцены, сохраняя баланс между качеством и производительностью.

Текстурная оптимизация

Текстуры определяют внешний вид объектов. Однако их разрешение и количество напрямую влияют на производительность сцены. Чем больше размер текстуры, тем больше памяти она занимает.Разрешение текстур выбирается в зависимости от их назначения. Детали, которые находятся в центре внимания, требуют высоких разрешений — 2K, 4K или 8K. Для скрытых или малозаметных элементов используют текстуры минимального разрешения.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Например, внутренняя поверхность здания или нижняя часть мебели, которые не видны или малозаметны в сцене, могут использовать однотонные текстуры или вообще обходиться без них. Это снижает нагрузку на GPU и уменьшает объём потрбляемой видеопамяти.

Подходы к оптимизации текстур:

Сжатие текстур

Для дополнительной оптимизации используются методы сжатия текстур: S3TC (S3 Texture Compression), PVRTC (PowerVR Texture Compression) и ASTC (Adaptive Scalable Texture Compression) и другие. Они сохраняют высокое качество изображения при меньших ресурсах.

Различия форматов сжатия текстур
Различия форматов сжатия текстур

Всё чаще появляются новые методы сжатия. Например, Neural Texture Compression (NTC) от NVIDIA, который использует нейронные сети для сжатия. Такой подход обеспечивает более высокую детализацию при аналогичных требованиях к памяти по сравнению с традиционными методами.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов
Сравнение Neural Texture Compression с Block Compression (стандартное сжатие текстур)
Сравнение Neural Texture Compression с Block Compression (стандартное сжатие текстур)

Создание текстурных атласов

Текстурные атласы — это метод объединения нескольких текстур в один общий файл, который затем используют для наложения на объекты. Атласы оптимизируют работу GPU, повышая общую производительность сцены. Вместо того, чтобы хранить отдельные текстуры для каждого объекта, в текстурном атласе все изображения размещаются в одной большой текстуре.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Например, вместо того чтобы загружать отдельные текстуры для металла, стекла и пластика, все они объединяются в один атлас. Каждый объект в сцене использует только определённую область атласа, соответствующую его текстуре. Это существенно ускоряет рендеринг, особенно в видеоиграх и мобильных приложениях.

Mip-mapping

Mip-mapping — техника, при которой для каждой текстуры создаётся серия уменьшенных копий с пониженным разрешением. При рендеринге используются версии текстур, соответствующие расстоянию до камеры, что снижает нагрузку на систему и предотвращает появление артефактов.

Каждая текстура в 2 раза меньше предыдущей
Каждая текстура в 2 раза меньше предыдущей

Современные графические движки Unreal Engine и Unity автоматически генерируют mip-уровни при импорте текстур, чтобы обеспечить оптимальное качество отображения на разных дистанциях.

Влияние на оптимизацию в зависимости от целей

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

Оптимизация освещения и теней

Предварительное освещение для статичных сцен

Когда сцена не предполагает изменения освещения или положения объектов (например, интерьер без движущихся источников света), разработчики используют предварительное освещение. Этот метод позволяет «запечь» данные о свете и тенях в текстуры, называемые lightmaps. Они создаются заранее и затем просто накладываются на объекты.

Оптимизация в 3D-графике: максимум качества, минимум ресурсов

Этот метод эффективен, потому что рендеринг света выполняется только один раз, что снижает нагрузку на GPU. Качество визуала при этом остаётся на высоком уровне, так как lightmaps содержат точную информацию о тенях и освещении. Unreal Engine и Unity предоставляют встроенные инструменты для генерации lightmaps.

Динамическое освещение сцен

В сценах, где источники света или объекты постоянно движутся, используют динамическое освещение. Оно рассчитывается в реальном времени. Современные игровые движки применяют технологии для повышения производительности, такие, например, как Screen Space Global Illumination.

Screen Space Global Illumination (SSGI) — метод, который вычисляет освещение на основе данных текущего кадра. Вместо того, чтобы отслеживать путь каждого луча, как в Ray Tracing, SSGI анализирует уже отрисованные объекты и создаёт рассеянный свет, тени и отражения. Например, ярко освещённая стена отражает свет на соседние объекты, создавая мягкое освещение. Это экономит ресурсы GPU, но имеет ограничения — элементы сцены, которые находятся вне кадра, не учитываются, что может привести к артефактам.

Screen Space Global Illumination — OFF / ON
Screen Space Global Illumination — OFF / ON

Инструменты для оптимизации освещения и теней

Чтобы уменьшить нагрузку на систему, используются следующие техники:

  • Кэширование теней. Если тени объектов не меняются (например, от статичных зданий), их рассчитывают один раз и сохраняют. Это сокращает число операций, необходимых для рендеринга.
  • Отключение невидимых источников света — culling. Источники света, которые находятся за пределами видимости камеры, отключаются, чтобы сэкономить ресурсы.
  • Снижение качества теней для дальних объектов. Для удалённых объектов используется низкое разрешение теневых карт, так как детали в этом случае незаметны для пользователя.

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

Автоматическая оптимизация

Искусственный интеллект становится важным инструментом в оптимизации 3D-графики. ИИ-алгоритмы применяются для анализа и сжатия текстур, улучшения геометрии моделей и даже автоматической генерации объектов. Алгоритмы машинного обучения, такие как инструменты NVIDIA и Intel Open Image Denoise, активно используют для устранения шумов и ускорения расчётов.

Open Image Denoise OFF / ON
Open Image Denoise OFF / ON

Графические движки Unreal Engine и Unity предлагают встроенные инструменты для автоматической оптимизации. Эти инструменты упрощают создание LOD, оптимизацию текстур через mip-mapping и сжатие, а также предоставляют гибкие настройки для освещения и теней. Например, в Unreal Engine используются технологии Nanite и Lumen. Nanite позволяет работать с геометрией в реальном времени, автоматически упрощая модели. Lumen, в свою очередь, обеспечивает реалистичное глобальное освещение в без необходимости предварительного расчета.

Заключение

Оптимизация 3D-графики — искусство достижения баланса между качеством визуального контента и расходом ресурсов оборудования. В современных играх и приложениях этот процесс становится всё сложнее из-за роста требований пользователей и стремления аудитории к фотореалистичности.

Больше про графические технологии, видеоигры и игровое железо — на нашем сайте, в Telegram-канале и ВК-паблике.

5858
33
45 комментариев

Два дтфера встретились и обсуждают то, что 50-я серия говно, Куртка греет гоев, платить корпоратам они не будут, деньги у них есть, просто не хотят.

8

Ты ошибся. Вот так правильно:
Два дтфера встретились и обсуждают то, что 50-я серия заебись, Куртка развивает технологии, они уже готовы кидать деньги корпоратам, накопленные с обедов в школе.

Пост с дефолтной информацией чисто для рекламы собственных площадок.

Как здорово что дтф стал площадкой где подобные контентмейкеры могут дышать свободно 🫡

6

Интересно, кто закладок на это недоразумение наделал.

Это уже просто лажа.
Чем сложнее сцена, тем больше ресурсов требуется для её обработки. Возникает вопрос: какую роль играет GPU и CPU в рендеринге?Да, конечно важно, давайте же разберемся. И что я вижу
GPU (графический процессор) — основной инструмент обработки графики. Через него проходят огромные объёмы данных, связанных с геометрией, текстурами и освещением в 3D-сцене.CPU (центральный процессор) отвечает за выполнение физических симуляций, расчёт поведения объектов и управление общей логикой.Нерациональное распределение нагрузки между этими двумя компонентами системы снижает производительность.Разобрались, мля.
Клоуны.

5

Больше воды, богу воды.

И сука не одна чушка не поясняет, как именно в той или иной среде, нагружается ЦПУ и ГПУ для отрисовки условного кадра на 1М поликов.

Почему то никто не объясняет, что почти вся геометрия всегда прогоняется через ЦПУ, перед тем как попасть в ГПУ и почти всегда, любая деформация сетки, это ЦПУ, которое потом обновляет буффер сетки.

Открывайте форточку, сейчас я буду нудить!

Mip-mapping: никогда не замечал разницы в производительности с ним и без него. Да, разница должна быть, но её почему-то нет.

так как lightmaps содержат точную информацию о тенях и освещенииВот не прям совсем точную, в классических лайтмапах нет информации о направлении на источник света, поэтому с ними не получится сделать блестящие поверхности. Есть ещё дирекшинал лайтмапы, но в них записывается усреднённое направление между всеми источниками света.

Есть ещё такая штука "отложенное освещение"- это когда освещение не применяется сразу при отрисовке объекта на экран, вместо этого объекты редерятся в несколько буферов (глубина, цвет, нормаль). А потом, когда все объекты отрендерились, позиция пикселя восстанавливается из буфера глубины, и освещение рендерится как обычно, но только для тех пикселей, которые есть "на экране"(ну или не для всех, Юнити, например, использует стенсил буфер, чтобы отбросить пикели, которые не попали в зону действия источника света)

Всякие-разные батчинги: например можно объединить несколько статичных объектов в один, который использует один материал (привет атласы), или объединить несколько, с одним материалом, динамических объектов на ЦПУ(Юнити так может делать для объектов с маленьким полигонажем, но насколько я могу судить, сейчас от этого выхлопа нет). Есть ещё варианты, когда могут объединяться объекты с разными материалами, не я на таком нузко уровне эту кухню не знаю, и не скажу как это работает.
В общем случае, видеокарта не любит когда её сетапят, она переключается в состояние сетапа, в котором она ничего не может делать, и вход и выход из этого состояния довольно долгие, и чем меньше таких сетапов будет- тем выше будет фпс.

И ещё на тему "не любит когда её сетапят" ГПУ инстансинг:
Если нужно отрисовать несколько одинаковых мешей с одним материалом, у которых отличаются какие-то небольшие параметры, типа положения, скейла и цвета, то не обязательно сетапить видеокарту 30 раз, чтобы нарисовать 30 копий меша, можно насетапить её один раз, передав изменяющиеся параметры массивом из 30 значений.

4