Оптимизация 3D-моделей для массового рендеринга
3D-моделированиеКогда нужно получить не десять красивых картинок, а 50 000 размеченных кадров, каждая лишняя миллисекунда рендера превращается в дни ожидания и счета за вычисления. Рассказываем, как мы готовим модели к массовому производству датасетов.

Почему оптимизация нужна именно для датасетов
Для рекламного рендера допустимо ждать несколько минут на кадр: картинка одна, её будут рассматривать вблизи. Синтетический датасет устроен иначе. Нужны тысячи и десятки тысяч кадров, на которых модель компьютерного зрения учится находить объекты, а не любоваться их фактурой. Если один кадр считается две минуты, то 50 000 кадров займут около 70 суток машинного времени на одной видеокарте. Ускорение каждого кадра до 15 секунд сокращает это же время до девяти суток, а параллельная работа на нескольких узлах доводит срок до приемлемого.
Поэтому в 3D-моделировании для датасетов оптимизация идёт не после, а вместе с разработкой модели. Мы сразу задаём бюджет: сколько полигонов, текстурной памяти и материалов допустимо на один объект, и сколько объектов одновременно окажется в кадре. Это похоже на разработку игровых ассетов, но с одним важным отличием: нам не нужно, чтобы модель выглядела идеально с любого ракурса вплотную. Нужно, чтобы она была достоверной на тех расстояниях, на которых её будет видеть камера в реальной задаче.
Типичная ошибка новичков состоит в том, что берут модель из CAD-системы или готовую модель из каталога и отправляют в рендер как есть. CAD-сетка содержит миллионы треугольников на крепёжных отверстиях, скрытых внутренних полостях и резьбе, которую на кадре не видно вообще. Результат: переполнение видеопамяти, падения процесса посреди партии и непредсказуемое время кадра.
Бюджет полигонов и уровни детализации
Начинать нужно с вопроса: какой размер объект занимает в кадре? Если деталь в среднем занимает 5-10 процентов высоты изображения, то детализация на уровне долей миллиметра бессмысленна. Мы ориентируемся на простое правило: один видимый полигон должен покрывать не меньше нескольких пикселей. Всё, что мельче, либо упрощается, либо переносится в карты нормалей.
Обычно мы делаем три уровня детализации (LOD):
- LOD0 для крупных планов, 20 000-80 000 треугольников на типовой предмет;
- LOD1 для среднего плана, примерно 3 000-10 000 треугольников;
- LOD2 для дальнего плана и массовки, не более 500-1 000 треугольников.
Переключение выполняется скриптом по расстоянию до камеры или по занимаемой площади в кадре. Важно, чтобы силуэт на соседних уровнях совпадал: иначе баундинг-бокс и маска, посчитанные по разным сеткам, будут отличаться на несколько пикселей, а это уже шум в разметке. Мы всегда считаем аннотации по одной и той же геометрии, независимо от того, какой уровень выбран для отображения, либо проверяем, что расхождение силуэта укладывается в допуск.
Как упрощать сетку без потери формы
Автоматическое прореживание (decimation) работает хорошо на органических формах и плохо на деталях с чёткими рёбрами. Для жёстких объектов лучше сначала удалить невидимое: внутренние полости, обратные стороны крепежа, дублирующиеся грани. Это даёт сокращение сетки на 30-60 процентов без единого визуального изменения. Затем применяется прореживание с защитой границ материалов и UV-швов, чтобы текстура не поплыла. Мелкие фаски и скругления, которые на дистанции съёмки не читаются, заменяются картой нормалей, снятой с исходной высокополигональной модели.
Текстуры и материалы: где прячется основная память
Геометрия редко становится главной проблемой. Гораздо чаще память съедают текстуры. Один комплект PBR-текстур в разрешении 4 096 на 4 096 пикселей с цветом, шероховатостью, металличностью и нормалями занимает сотни мегабайт в несжатом виде. Если в сцене 40 разных объектов, видеопамять заканчивается мгновенно. О том, как устроены материалы, мы подробно писали в статье про PBR-материалы, а здесь важны именно практические приёмы экономии.
Что работает лучше всего:
- Подбирать разрешение текстуры под экранный размер. Предмет, занимающий в кадре 200 пикселей, не нуждается в текстуре 4 096 пикселей, хватит 512 или 1 024.
- Объединять мелкие предметы в текстурные атласы, чтобы сократить число материалов и вызовов отрисовки.
- Упаковывать каналы: шероховатость, металличность и окклюзию складывать в три канала одного изображения.
- Хранить текстуры в сжатых форматах, а на диске держать копии в нескольких разрешениях под разные LOD.
- Не использовать процедурные шейдеры с большим числом узлов там, где достаточно запечённой карты.
Отдельная тема: число уникальных материалов в сцене. Движки рендеринга тратят заметное время на компиляцию и переключение шейдеров. Если у модели 30 материалов на 30 мелких деталей, а визуально отличаются только три, остальные нужно слить. Мы обычно ограничиваем сложные объекты пятью-восемью материалами.
Инстансинг и повторное использование данных
Если в кадре сто одинаковых бутылок, их геометрия не должна лежать в памяти сто раз. Инстансинг хранит одну копию сетки и список преобразований: положение, поворот, масштаб. Выигрыш по памяти для сцен с массовкой достигает десятков раз, а время подготовки сцены падает почти пропорционально. Для вариативности внутри инстансов мы используем параметры материала: смещение оттенка, степень загрязнения, случайную маску потёртостей. Так из одного ассета получается десятки визуально различных экземпляров, и это напрямую работает на доменную рандомизацию.
Кроме инстансинга, есть ещё несколько приёмов повторного использования:
- кеширование загруженных моделей между кадрами одной сессии вместо повторного чтения с диска;
- хранение сцены-шаблона с фиксированным окружением и пересчёт только того, что меняется: объекты, свет, камера;
- запуск рендера пакетами по несколько сотен кадров в одном процессе, чтобы не платить каждый раз за запуск и загрузку ассетов.
Последний пункт часто недооценивают. Холодный запуск движка и загрузка тяжёлой сцены могут занимать от 20 до 90 секунд. Если кадр считается 10 секунд, накладные расходы превышают полезную работу в несколько раз.
Настройки рендера: качество там, где оно нужно
Даже идеально подготовленная модель не поможет, если рендер настроен расточительно. Главный рычаг, это число сэмплов на пиксель. Для обучения детекторов мы почти никогда не гоним картинку до полного отсутствия шума: современное шумоподавление на базе нейросети позволяет остановиться на 64-128 сэмплах вместо 1 000 и более, а остаточный шум к тому же полезен, потому что у реальных камер он тоже есть. Подробнее о том, как имитировать сенсор, читайте в статье про виртуальную камеру.
Вторая группа настроек касается глубины трассировки лучей. Для большинства сцен достаточно 4-6 отражений и 2-3 преломлений. Прозрачные и стеклянные объекты требуют больше, но их лучше отмечать отдельно и считать с повышенным лимитом только там, где они действительно есть. Каустики, объёмный туман и сложное подповерхностное рассеяние включаются точечно, когда без них теряется узнаваемость материала.
Практическое правило: если разница между быстрым и медленным вариантом рендера не видна на фоне естественного шума реальной камеры и не меняет метрики детектора, выбираем быстрый.
Измеряем и контролируем: таблица бюджетов
Оптимизация без измерений превращается в гадание. Перед запуском полной партии мы прогоняем пилот в 100-200 кадров и записываем время кадра, пиковую память и размер файлов. Затем сверяем с бюджетом.
| Параметр | Целевое значение | Что делать при превышении |
|---|---|---|
| Время кадра | до 15-20 секунд | снизить сэмплы, упростить LOD |
| Видеопамять | не более 70 процентов от доступной | уменьшить текстуры, включить инстансинг |
| Число материалов на объект | 5-8 | слить материалы, использовать атлас |
| Треугольников в кадре | до 5-10 миллионов | подключить LOD, удалить скрытые детали |
| Размер одного кадра на диске | 1-3 мегабайта вместе с масками | сменить формат, сжать карты глубины |
Эти значения ориентировочные и зависят от железа, но сам подход полезен: у каждого параметра есть число и понятное действие. Если после пилота хотя бы один показатель выходит за рамки, мы исправляем модель до старта массового рендера, а не в его середине, когда уже потрачены сотни часов.
Типичные ошибки и как их избежать
Первая ошибка, оптимизировать вслепую и испортить форму. Если после прореживания у объекта изменился силуэт, детектор научится находить объект, которого в реальности не существует. Решение: сравнивать маски исходной и упрощённой модели с одной камеры и контролировать пересечение, оно должно быть выше 98-99 процентов.
Вторая ошибка, забыть про нормали и масштаб. Модели из разных источников приходят в разных единицах измерения: одна в миллиметрах, другая в метрах. Автоматическая проверка размера при импорте экономит часы отладки, потому что огромный или крошечный объект обычно ломает освещение и глубину резкости.
Третья ошибка, оптимизировать только модель и забыть про сцену. Фон из десятков тысяч полигонов, огромные карты окружения и лишние источники света способны съесть половину времени кадра. Окружение мы упрощаем так же последовательно, как и главные объекты, а HDRI-карты подбираем минимально достаточного разрешения. Принципы работы со светом разобраны в материале про освещение в рендере.
Что в итоге
Хорошо оптимизированная модель, это не обязательно самая лёгкая модель. Это модель, у которой заранее известно, сколько она стоит по времени и памяти, и которая ведёт себя одинаково в тысячной итерации и в первой. Для заказчика это означает предсказуемые сроки и стоимость: мы можем заранее назвать, сколько кадров в сутки способна дать конвейерная линия, и не переписывать смету посреди проекта.
Если у вас есть CAD-модели, сканы или готовые ассеты и вы хотите понять, насколько они подходят для массового рендера, напишите нам на [email protected]. Мы оценим бюджет геометрии и материалов на тестовом датасете, а преимущества подхода обычно становятся наглядны уже на объёмах от нескольких тысяч изображений. Условия и ориентиры по срокам собраны на странице как мы работаем.
Нужен датасет под вашу задачу?
Подготовим тестовую партию изображений с разметкой, чтобы вы могли проверить подход на своей модели. Напишите на [email protected] или оставьте заявку.
Читайте также
3D-моделированиеПроцедурная генерация сцен для датасетов
Вручную собрать сто сцен реально, десять тысяч — нет. Процедурная генерация задаёт правила, по которым компьютер сам строит разнообразные сцены. Рассказываем, как это устроено и где подводные камни.
3D-моделированиеФотограмметрия: как получить 3D-модель реального предмета
Фотограмметрия превращает набор обычных фотографий в трёхмерную модель с текстурой. Рассказываем, как снимать, обрабатывать результат и когда этот способ лучше моделирования вручную.
3D-моделированиеВиртуальная камера: объективы, шум и искажения
Идеальная камера без шума, бликов и искажений делает синтетические кадры слишком чистыми, и модель теряется на реальных снимках. Разбираем, какие параметры оптики и сенсора стоит повторять и как это делать без лишней сложности.