Не раз возникала такая ситуация. Когда, например, порендерил увесистую сиквенцию (в данном примере 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, или по выделению, или инклуде-листу. А в других рендер-движках нет и такого. Прикол моего варианта в том, что он универсален. И должен работать практически на любых рендерерах.