Погружение в ментал (освещение часть последняя GI)
Заключительный урок по освещению в mental ray
Несмотря на то, что концепция Глобального освещения (GI) очень проста, правильное освещение сцен с использованием этого алгоритма вызывает некоторые трудности.
Как правило, возникает парадокс – mental ray довольно быстро обсчитывает сцены, но при включении GI мы видим ухудшение качества и пытаемся это исправить увеличением количества фотонов и уменьшением их радиуса (последнее определение не верно, но подробности в уроке) тем самым время расчетов увеличивается до бесконечности, а результата не видно. В уроке будет на примерах показаны проблемы обсчета и пути их решения.
Первая часть урока, короткая и теоретическая, для тех, кто первый раз столкнулся с алгоритмом глобального освещения, вторая часть практическая и подразумевает, что изучающие уже практически пользуются mental ray либо изучили все мои предыдущие уроки по освещению на www.render.ru
Выполняться будет в 3ds Max 2009.
В уроке я использую сокращения:
GI – Global Illumination - глобальное освещение
FG - Final Gather – финальная сборка (алгоритм непрямого освещения – подробнее Погружение в ментал (Освещение часть 1 - FG))
ИС – Источники света (подробнее Погружение в ментал (освещение часть 3 - источники))
Во второй части я показываю решение некоторых проблем, но не претендую на 100% правильности методов, все они следуют из индивидуальной практики.
Итак, приступим:
Часть первая – теория
Глобальное освещение (далее GI) это алгоритм непрямого освещения, основан на генерировании источником света (далее ИС) GI-фотонов, которые встречаясь с объектом изменяются с учетом его материала и отразившись освещают рядом стоящие объекты. Наглядно я этот эффект изобразил на простом рисунке:
там, где включен GI, свет отобразился от сферы, принял ее красный цвет и осветил коробку изнутри.
Применение GI выводит освещение сцен на более совершенный уровень, тем более что в mental ray есть источники света, которые не генерируют прямое освещение, а только фотоны GI.
Включается алгоритм GI для всей сцены в настройках рендера (Render Setup <F10>) закладка Indirect Illumination (непрямое освещение) – галка Enable (включить):
Настройки GI:
Multiplier – общий множитель яркости эффекта и цвет фильтра.
Maximum Num Photons per Sample – качественная характеристика - количество фотонов для подсчета в семпле – уменьшение ведет к появлению шума.
Maximum Sampling Radius – радиус площадки сбора фотонов , очень часто путают с радиусом фотона – в mental ray фотоны не имеют радиуса, параметр от которого напрямую зависит качество освещение, изменение настройки только этого показателя, как правило не приводит к прямому улучшению качества (подробности в практической части)
Merge Nearby Photons - качественная характеристика – алгоритм объединения фотонов – задается расстояние, на котором происходит объединение нескольких фотонов в один – включение параметра может привести к ухудшению качества, но экономии памяти – актуально включать, когда мы увеличением количества фотонов пытаемся поднять качество картинки в одной проблемной области, а при этом остальные области не нуждаются в таком количестве.
Optimize for Final Gather – при использовании GI совместно с Final Gather (далее FG) оптимизирует вычисление совместно освещенных участков. Работает как дополнительный алгоритм и занимает немного больше времени при рендере.
Поле – Light Properties:
Average GI Photon per Light – количество фотонов, излучаемое источником света. Как правило, изменение этого параметра без изменения радиуса семпла к ощутимым положительным результатам не приводит (подробности в практической части).
Decay - параметр затухания фотонов, физически корректное значение = 2 (согласно квадрату расстояния) если вы используете физически корректное освещение, не меняйте значение, для художественных целей интересно уменьшать значение совместно с уменьшением энергии ИС.
Параметры в Trace Depth указывают количество отражений и преломлении, которые произойдут с фотоном, прежде чем он пропадет, желательно максимальную глубину установить на 5, а не 10 по умолчанию – это сэкономит время, а результат практически не измениться.
Итак, это все что нам надо знать по теоретической части по GI.
Давайте смоделируем помещение и будем настраивать (а иногда и бороться) с глобальным освещением.
Часть вторая – практика
Итак, у нас есть сцена, которую мы хотим осветить. Я сделал небольшое помещение:
основной поток солнечного света будет падать из отверстия в потолке (сейчас там темная дырка), освещаться все будет системой дневного света, солнце практически в зените. В результате у основания колонны должно быть яркое пятно от прямой иллюминации (прямых солнечных лучей), а все остальное будет освещаться непрямой иллюминацией созданной этим светлым пятном и частично светом небосвода, что смог попасть через верхнее отверстие.
Включаю солнце, настраиваю экспозицию и сразу вижу первую проблему GI.
Все помещение в бежевых тонах! Почему?
Солнечный свет (прямой) осветил пятно на полу, который у меня покрыт материалом A&D (под полированное дерево) коричневых тонов, фотоны непрямой иллюминации приняли оттенок материала и полетели освещать внутренности помещения, окрашивая все в бежевое. В принципе на этой картинке еще все более менее терпимо, но покроем пол синей плиткой (тоже A&D):
скажите жуть? Нет, это тоже еще терпимо, а вот, возьмем материал из набора ProMaterials – Пластик, тоже синий:
вот это уже ближе к жути!
Моделил я в метрической системе, теоретически расчет GI и FG должен проходить корректно. Может я не прав, но в реальном мире нет такого сильного переноса цвета от ярких поверхностей, если Солнце освещает красный ковер в моей комнате (и такое бывает в нашем хмуром городе Питере), то комната не погружается в багровые тона.
Что-то тут разработчики упустили, либо считают, что мы сами должны позаботиться об этом эффекте.
Давайте позаботимся и исправим данное недоразумение. Я опишу три способа – два частных случая и один кардинальный.
Вернемся к помещению с деревянным полом (рис № 2)
Первый способ состоит в подборе фильтра на GI ну и соответственно поставим его же на FG.
Чтобы компенсировать желто-бежевый цвет нужен светло-голубой фильтр, его и поставим (правда на GI и FG пришлось поставить немного разные фильтры, но кто сказал что будет легко):
делаем рендеринг:
явно с бежевым цветом справились. В чем два минуса этого способа?
Первое это подбор цвета фильтра (тем более что их два) и второе это то, что так мы можем компенсировать всего один цвет. Что делать если у меня половина пола красная, а вторая зеленая? В этом случае фильтр не поможет.
Второй способ. Давайте подумаем, почему происходит такая сильная окраска фотонов. Может я ошибаюсь, но по-моему, диффузный цвет из шейдера поверхности без изменений переноситься в шейдер фотонов, либо недостаточно ослабляется (это конечно касается предустановленных материалов, при работе с материалом mental ray, мы сами настраиваем этот шейдер). Давайте сменим шейдер. Открываем закладку «mental ray Connection» в свойствах материала и снимаем блокировку (замочек) с шейдера фотонов:
далее нажимаем кнопку шейдера и выбираем Photon Basic (base):
и диффузную составляющую цвета настаиваем по своему желанию:
это именно тот цвет, который будут приобретать фотоны GI при столкновении с материалом, он должен быть более блеклым, чем диффузный цвет самого материала, ну и соответственно чем он темнее, тем меньше эффект от освещения GI с этого материала.
Изменяем и рендерим:
У этого свойства тоже есть пара недостатков. Первое это то, что алгоритм FG все равно сделает свое черное дело (или бежевое в нашем случае), а втрое это то, что у предустановленных материалов группы ProMaterials невозможно сменить шейдер фотонов.
Итак, третий способ.
Он основан на работе с картами фотонов, а заодно и с картой FG.
Сохраняем наш проект (на всякий случай, хотя можно потом обойтись и функцией отмены действия ctr+Z)
Делаем еще один материал бледно серенького цвета, с минимальным отражением и полностью непрозрачным (я воспользовался материалом для покраски стен, что в принципе и советую):
Обратите внимание, я активировал опцию Ambient Occlusion, пока просто там ставим галку, подробности будут ниже.
Выделяем все объекты сцены и назначаем им этот материал (не бойтесь, мы же сохранили нормальную сцену)
Сцена приобрела следующий вид:
серо, хмуро, но нам так нужно.
Теперь заходим в настройки непрямой иллюминации
Для начало сохраним карту FG. Раздел Final Gather Map, включаем галку – «Read/Write File», потом жмем по кнопке с точками и указываем имя и место, куда сохраниться карта:
после чего жмем кнопку «Generate FG Map File Now» и ждем процесс генерации.
Внимание – если это финальный рендер, установите нормальные параметры качества, тем более что ждать генерацию FG вы будете только сейчас, в дальнейшем на это больше тратиться время не будет!!! Все будет браться из сохраненной карты.
Аналогично делаем для GI:
ставим галку, указываем имя файла и жмем на генерацию.
Обе карты сохранены, теперь грузим сохраненную сцену с нормальными материалами, или делаем отмену действий.
Опять ставим галки в Read/Write File на обоих алгоритмах (или проверяем, что они стоят если отменяли действие)
Проверяем, что указан наш сохраненный файл и в алгоритме для FG «замораживаем» карту нажав на «замочек»:
теперь смело жмем кнопку РЕНДЕР, замечаем что нет процесса генерирования фотонов и FG:
и наблюдаем приемлемый результат переноса цвета фотонами.
Многие сейчас могут возмутиться:
«А как же сама концепция переноса цвета материала фотонами !!! мы ее убили на корню !!! а люди писали алгоритмы, работали!!!»
Во-первых - ничего и не убили, кто мешает назначать всем материалам один серый/белый цвет, а пол можно сделать немного желтоватым :-)
А во-вторых, давайте обратимся к физике, как происходит процесс передачи цвета, точнее отражения спектра.
В mental ray подразумевается, что он сразу смешивается (либо полностью либо в ослабленном виде – точно не знаю это нужно изучать программу шейдера)
А в реальном мире окрашивание происходит из-за попадания света в толщу материалов и возвращения из нее уже с отфильтрованным спектром, даже самые «непрозрачные материалы» имеют прозрачность на срезе очень маленькой толщины, но основная масса света отражается от полированной поверхности сразу, не проникая во внутрь и чем плотнее материал, тем больше.
поэтому камни будут отражать в основном белый цвет (цвет источника точнее) металлы немного его подкрашивать, пластики еще больше смешивать со своим цветом, ну а стекло… и так понятно.. там больше каустика, кроме того на цвет отражение еще влияет качество полировки, шероховатые поверхности больше окрасят отраженный свет, полированные меньше.
Пока плотность материала мы в Максе задавать не можем, а в предустановленных материалах она видно работает не так хорошо, как нам хочется. Поэтому придется имитировать GI описанными выше способами, либо для большей реальности можно включить эффект каустики (это и есть черная стрелка на рисунке, мы привыкли считать что каустика это только у стеклянных объектов, а это еще и зеркальные блики) либо пользоваться материалами mental ray на основе подслойного рассеивания – группа SSS.
Теперь присмотримся ко второй проблеме.
На рисунке номер 7 стена и колонны как бы сливаются, точнее на них теряется объем – картинка замылена. Корень проблемы в некачественном освещении фотонами GI. Прямой свет от ИС дает ярко выраженные тени, подчеркивая объем элементов сцены. С фотонами немного сложнее – они не дают теней, тени получаются на тех местах, где меньше всего попало фотонов, соответственно, чем меньше фотонов (и больше площадки приема фотонов – семплы) тем меньше контрастность.
Возьмем, например помещение, которое освещается только непрямой иллюминацией и в нем установлена конструкция с неровными поверхностями, я сделал что-то вроде лестниц:
и сделаем рендер, включив GI, но не меняя количества фотонов:
желтым я пометил места, где явно выражена обсуждаемая проблема. Согласитесь неприятная ситуация. Напрашивается вывод – увеличить количество фотонов и уменьшить радиус семпла, но это сильно увеличивает время обсчета, после чего мы заметим еще пару тройку мест, где опять слабые тени и процесс увеличения количества фотонов будет бесконечным, пока компьютер не откажется работать. Сразу вспоминается куча анекдотичных ситуаций, про качество и количество, на основании которых можно интерпретировать анекдот про графику:
Сидят вечером три работника в сфере CG, и обсуждают свои проекты.
Первый говорит:
- Сегодня закончил сцену, осталось обсчитать с 10 млн. фотонов, дня через три закончу.
Второй отвечает:
- Тоже все закончил, но не хватает мощности компа, доставлю память и закончу проект.
Сидят жалуются на быстродействие техники, а потом спрашивают третьего:
- А ты чего молчишь? как ты борешься со сложными обсчетами?
- А я использую Ambient Occlusion! Все сдал и завтра в отпуск.
Давайте и мы не будем решать проблему экстенсивно, а воспользуемся имитацией глобального освещения на материале.
Если используются материалы группы ProMaterials, то в них есть опция Special Effects, в которой и можно включить Ambient Occlusion
Параметр samples это качество просчета – чем больше, тем лучше.
Параметр Max Distance один из основных – это дистанция, с которой происходит учет рядом стоящей геометрии для формирования эффекта глобального освещения (со всех сторон). Если мы хотим показать эффект явно, то тут нужно установить расстояние до соседнего объекта, а если просто хотим подчеркнуть геометрию объектов (как в нашем случае) достаточно от 10см до полуметра. Ниже параметры смешивания и размытия, нам сейчас они не очень нужны, так как функция АО второстепенна.
Если используется материал не из группы ProMaterials, то придется диффузный цвет смешивать с шейдером АО, желательно по карте Falloff. А в некоторых материалах и материальных шейдерах есть слот Ambient, в который и нужно установить шейдер Ambient/Reflective Occlusion и настроить дистанцию:
ни в коем случае не оставляете дистанцию по умолчанию (равна 0) для закрытых помещений, если параметр нулевой, то просчет материала происходит с максимального расстояния (с фона сцены) и с учетом стен помещения вы получите полностью затемненный материал. Параметр Samples, аналогично – качество. Остальные параметры в настройке для нашего случая не нуждаются.
Итак, добавляем Ambient Occlusion, который работает очень быстро и не трогаем количество фотонов:
согласитесь есть разница! Учитывая, что рендериг по времени почти не увеличился.
Перейдем к третей и четвертой проблеме, они взаимосвязаны.
Присмотритесь к рисунку (№ 8) у верхнего отверстия на потолке, если присмотреться есть круглое светлое пятно.
Для выявления этого эффекта я прорублю два окна и немного испорчу потолок у помещения:
Первое обозначено красной стрелкой – это засветленное пятно, сейчас мы воочию видим семпл сбора фотонов, который светлее обычного фона. Кардинальное решение проблемы будет чуть ниже, а сейчас частный случай:
На одну из колонн у окна я поставил материал Raytrace. Вообще-то mental ray поддерживает визуализацию стандартных материалов 3D Max, настраивая поверхность этого материала я не трогал шейдер фотонов, а он оказывается настроен не корректно! Поэтому от колонны отразился несбалансированный поток фотонов, который и принялся семплом, создав площадку, ярче фона.
Вывод - желательно пользоваться материалами mental ray, а если у вас есть любимый и настроенный старый материал, позаботьтесь о настройке шейдера фотонов как мы делали выше в обсуждении первой проблемы. Но это частный случай. Общее конечно в настройке семплов и количества фотонов.
Посмотрите на желтую стрелку, такое ощущение что у меня потолок над окнами не подогнан к стенам (или наоборот), на самом деле все там в порядке, иначе бы светило было по всему периметру стыка. Дело в том что я продлил потолок на улицу и получил эффект с которым мы часто сталкиваемся при визуализации интерьеров освещенных ярким светом.
Разберем эффект на самом частом и явном примере. Такие пятна как правило появляются под подоконниками, где должно быть по умолчанию темно, а mental почему то там ставит такие пятна. Вот схемка их образования:
черный круг это семпл сбора фотонов. Программа визуализатор, в видимую часть стены ставит семпл сбора фотонов, центр которого находиться под подоконником и соответственно почти весь он в тени. Но маленькая его часть вылезает в освещенную часть, а там очень ярко и эта «маленькая часть», собирает очень много фотонов, в результате среднее арифметическое фотонов для темного места велико, а для светлого места мало. Семпл неделимая единица, поэтому визуализатор считает освещение в этом месте не корректно.
Выход только в уменьшении радиуса семпла и увеличении количество фотонов. По умолчанию размер семпла одна десятая размера сцены, а в нашем случае его нужно сделать по высоте подоконника.
Оптимальный расчет можно сделать так:
X = размер сцены разделенное на 10 (например 1,2 метра)
Y = размер объекта который вызывает проблему, разделенное на 2 (например 0,03 м)
Размер семпла (Maximum Sampling Radius) = Y
Количество фотонов (Average GI Photons per Lihgt) = начальное значение умноженное на X деленное на Y (у меня это 20000*40 = 800000)
Выше параметры ставить бесполезно – это ничего не даст – только время потратим.
(любители геометрии сейчас могут возмутиться - почему мы делим на 40, а не на 2 в 40-ой степени? Ведь площадь уменьшается согласно квадрату!!! Все правильно мы делаем, ведь семплы ставятся пересекаясь и накладываясь! А не рядышком и воздействие каждого фотона уменьшается на корень из 2)
в моей сцене получилось 400000 фотонов, плюс еще некоторая настройка окружения:
В итоге время рендера вместе с генерацией карт освещения на процессоре 2х2Ггц - 4 минуты 31 секунда (148 тыс полигонов – деревце за окном прибавило)
Согласитесь это лучше чем генерировать часами миллионы фотонов и получать минимальные результаты.
В конце урока оговорюсь опять – все это результаты собственного опыта и расчетов и я не претендую на сто процентную правильность.
На этом уроки по освещению заканчиваю, но это не значит, что не будет уроков по другим темам.
С уважением, КАА