Динамический Render Region - как отрендерить только нужный объект/материал
Не раз возникала такая ситуация. Когда, например, порендерил увесистую секвенцию (в данном примере 1300 кадров) и уже на постпродакшене заметил косяк в каком-то одном элементе/материале. В данном случае в задней фаре не загораются фонари заднего хода и стопаки, хотя должны.
В сцене всё это быстро пофиксил, но что делать потом? Перерендеривать всю сиквенцию (больше 100 часов) - жирновато будет. Нужно уложиться в одну
ночь, чтоб с утра встать, и уже доделать финальные пост-эффекты. Нужно как-то порендерить одну только заднюю фару, но корректно. Возможные мысли:
- Обычный render region - не подходит. Он квадратный и статичный. А фара не квадратная, и не статичная. К тому же не все рендер-движки могут адекватно работать с рендер-регионом.
- Скрыть всю сцену кроме фары - не вариант, нужно чтобы весь GI, и все отражения - точно совпали.
- Cделать материал, который на камеру отображается чёрным, а в отражениях и преломлениях рендерится нормальным - слишком долго и муторно, в сцене
куча материалов, и возиться с каждым - не вариант. К тому же могут возникнуть проблемы с моушен блюром на границах фары, когда на неё бы налезал чёрный.
- Убирать у объектов "визибл ту камера" = проблемы на границах объекта при моушен блюре. Кроме того, если бы нужно было исправить один конкретный материал, а не объект, то такой способ тоже не подошёл бы.
Короче. Придумал универсальный вариант. У меня в отрендеренных mat-ID как раз была эта задняя фара.
А если бы её и не было - можно было бы по-быстрому отрендерить простенькую id-сиквенцию, где на всю сцену кидаем чёрный материал, а на заднюю фару - белый самосвет.
В общем беру эту маску, накидываю гауссиан блюр, и левелсами как-бы немного расширяю границы маски, создавая небольшую безопасную зону вокруг фары, как раз для дальнейшего безопасного смешивания, чтоб не было косяков с моушен-блюром, с эджами, и всем таким.
Рендерю всю секвенцию в пнг.
В сцене делаю плейн c соотношением сторон по размеру кадра. В моём случае это стандартные 16х9.
Делаю ему плотную квадратную сетку.
Выравниваю его к камере (вместе с вращением по всем осям). Отодвигаю по локальной оси от камеры, сантиметров на 10. И линкую к ней.
И делаю ему такой скейл, чтобы края плейна точно совпадали с краями кадра.
Потом выделяю бордер, и добавляю немножко аутлайна, чтоб не было недоразумений по краям кадра.
Дальше кидаю на плейн стандартный максовский дисплейс. Назначаю ему картой высот порендеренную ранее пнг-сиквенцию с заблюренной маской. Высоту
выбираю сантиметров 20, чтобы он уверенно уходил за камеру.
И дальше в камере делаю "неар плейн клиппинг", и ставлю его почти вплотную к плейну.
На плейн кидаю абсолютно чёрный материал, и исключаю его из GI, отражений, и преломлений. И всё. Готова динамическая геометрическая маска для
быстрого рендера, с безопасными отступами, и автоматически подстраивающаяся под наш объект, и его расположение.
Никаких проблем с дополнительными рендер-пассами, если они тоже будут нужны.
Ни с здептхом, ни с масками, ни с прозрачностью, ни с и преломлениями. И также никакого изменяемого количества полигонов в пределах одного кадра.
Также по форме маски в сцене можно быстро посмотреть, какие из кадров нужно перерендеривать. Как только на маске начинают вытягиваться дисплейсовые искажения - значит начальный кадр. А когда искажения исчезают, и маска снова превращается в плоскость - это конечный кадр. Вырубаю все ненужные рендер элементсы, оставляю только главный бьюти-пасс, и преломления. Готово.
Smash the render button!
В результате рендерится пофикшенная часть кадра с фарой, и небольшой безопасной зоной вокруг неё. Время на кадр: 39 секунд. Превосходно.
Дальше просто накидываю фикс поверх старого бьюти пасса, через оригинальную незаблюренную маску, и рендерю пофикшенную и полностью готовую
exr-сиквенцию.
Сэкономлено 90 часов.
Кто-то скажет: "слыш Александр, но ведь в вирее же есть Render Mask (Texture), чё ты тут нам впариваеш какую-то дичь, можно туда засунуть эту заблюренную ч/б маску, и радоваться". Окей, в вирее есть. А где ещё есть? Даже в той же короне (ver.11, на момент написания) нету, там можно только по g-buffer, или по выделению, или инклуде-листу. А в других рендер-движках нет и такого.
Прикол моего варианта в том, что он универсален. И должен работать практически на любых рендерерах.
В то же время кто-то другой мог бы сказать "что это ещё за проблемы на границах объекта при моушен блюре? Про што ты мне толкуеш, фраер, не понимаю, ты фсё выдумал!".
Краткое объяснение для тех, кто пока ещё не работал с моушен блюром. Берём простейший пример. Чайник на фоне других чайников, и ещё один чайник перед ними. Наш парень - красный чайник, на среднем плане. Рендерим обычный кадр, короной с моушен блюром. Всё окей.
Но если нам надо перерендерить один лишь красный чайник. Окей, включаем в Corona11 новомодный Render Selected, про который все говорят. Он рендерит один лишь чайник. Хорошо? Не оч. Он рендерит его на чёрном фоне. С альфа-каналом, все дела.
Но если мы попробуем наложить этот кадр на наши изначальный кадр, то получим ужасные чёрные края объекта.
Если кто не уловил разницу - вот гифка:
Выглядит ужасно. И вот как раз для избежания такого эффекта и нужна безопасная зона вокруг объекта.