Архитектурные решения различных форм и помещений

Погружение в ментал (освещение часть последняя GI)

Заключительный урок по освещению в mental ray

Несмотря на то, что концепция Глобального освещения (GI) очень проста, правильное освещение сцен с использованием этого алгоритма вызывает некоторые трудности.

Как правило, возникает парадокс – mental ray довольно быстро обсчитывает сцены, но при включении GI мы видим ухудшение качества и пытаемся это исправить увеличением количества фотонов и уменьшением их радиуса (последнее определение не верно, но подробности в уроке) тем самым время расчетов увеличивается до бесконечности, а результата не видно. В уроке будет на примерах показаны проблемы обсчета и пути их решения.

Первая часть урока, короткая и теоретическая, для тех, кто первый раз столкнулся с алгоритмом глобального освещения, вторая часть практическая и подразумевает, что изучающие уже практически пользуются mental ray либо изучили все мои предыдущие уроки по освещению на www.pasha-sevkav.ru

Выполняться будет в 3ds Max 2009.

В уроке я использую сокращения:

GI – Global Illumination - глобальное освещение

FG – Final Gather – финальная сборка (алгоритм непрямого освещения – подробнее Погружение в ментал (Освещение часть 1 – FG))

ИС – Источники света (подробнее Погружение в ментал (освещение часть 3 – источники))

Во второй части я показываю решение некоторых проблем, но не претендую на 100% правильности методов, все они следуют из индивидуальной практики.

Итак, приступим:

Часть первая – теория

Глобальное освещение (далее GI) это алгоритм непрямого освещения, основан на генерировании источником света (далее ИС) GI-фотонов, которые встречаясь с объектом изменяются с учетом его материала и отразившись освещают рядом стоящие объекты. Наглядно я этот эффект изобразил на простом рисунке:

image0023

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

Применение GI выводит освещение сцен на более совершенный уровень, тем более что в mental ray есть источники света, которые не генерируют прямое освещение, а только фотоны GI.

Включается алгоритм GI для всей сцены в настройках рендера (Render Setup <F10>) закладка Indirect Illumination (непрямое освещение) – галка Enable (включить):

image0032

Настройки 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.

Давайте смоделируем помещение и будем настраивать (а иногда и бороться) с глобальным освещением.

Часть вторая – практика

Итак, у нас есть сцена, которую мы хотим осветить. Я сделал небольшое помещение:

image0045

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

Включаю солнце, настраиваю экспозицию и сразу вижу первую проблему GI.

image0053

Все помещение в бежевых тонах! Почему?

Солнечный свет (прямой) осветил пятно на полу, который у меня покрыт материалом A&D (под полированное дерево) коричневых тонов, фотоны непрямой иллюминации приняли оттенок материала и полетели освещать внутренности помещения, окрашивая все в бежевое. В принципе на этой картинке еще все более менее терпимо, но покроем пол синей плиткой (тоже A&D):

image0064

скажите жуть? Нет, это тоже еще терпимо, а вот, возьмем материал из набора ProMaterials – Пластик, тоже синий:

image0073

вот это уже ближе к жути!

Моделил я в метрической системе, теоретически расчет GI и FG должен проходить корректно. Может я не прав, но в реальном мире нет такого сильного переноса цвета от ярких поверхностей, если Солнце освещает красный ковер в моей комнате (и такое бывает в нашем хмуром городе Питере), то комната не погружается в багровые тона.

Что-то тут разработчики упустили, либо считают, что мы сами должны позаботиться об этом эффекте.

Давайте позаботимся и исправим данное недоразумение. Я опишу три способа – два частных случая и один кардинальный.

Вернемся к помещению с деревянным полом (рис № 2)

Первый способ состоит в подборе фильтра на GI ну и соответственно поставим его же на FG.

Чтобы компенсировать желто-бежевый цвет нужен светло-голубой фильтр, его и поставим (правда на GI и FG пришлось поставить немного разные фильтры, но кто сказал что будет легко):

image0082

делаем рендеринг:

image0092

явно с бежевым цветом справились. В чем два минуса этого способа?

Первое это подбор цвета фильтра (тем более что их два) и второе это то, что так мы можем компенсировать всего один цвет. Что делать если у меня половина пола красная, а вторая зеленая? В этом случае фильтр не поможет.

Второй способ. Давайте подумаем, почему происходит такая сильная окраска фотонов. Может я ошибаюсь, но по-моему, диффузный цвет из шейдера поверхности без изменений переноситься в шейдер фотонов, либо недостаточно ослабляется (это конечно касается предустановленных материалов, при работе с материалом mental ray, мы сами настраиваем этот шейдер). Давайте сменим шейдер. Открываем закладку «mental ray Connection» в свойствах материала и снимаем блокировку (замочек) с шейдера фотонов:

image0102

далее нажимаем кнопку шейдера и выбираем Photon Basic (base):

image011_s

и диффузную составляющую цвета настаиваем по своему желанию:

image0122

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

Изменяем и рендерим:

image0132

У этого свойства тоже есть пара недостатков. Первое это то, что алгоритм FG все равно сделает свое черное дело (или бежевое в нашем случае), а втрое это то, что у предустановленных  материалов группы ProMaterials невозможно сменить шейдер фотонов.

Итак, третий способ.

Он основан на работе с картами фотонов, а заодно и с картой FG.

Сохраняем наш проект (на всякий случай, хотя можно потом обойтись и функцией отмены действия ctr+Z)

Делаем еще один материал бледно серенького цвета, с минимальным отражением и полностью непрозрачным (я воспользовался материалом для покраски стен, что в принципе и советую):

image014

Обратите внимание, я активировал опцию Ambient Occlusion, пока просто там ставим галку, подробности будут ниже.

Выделяем все объекты сцены и назначаем им этот материал (не бойтесь, мы же сохранили нормальную сцену)

Сцена приобрела следующий вид:

image0152

серо, хмуро, но нам так нужно.

Теперь заходим в настройки непрямой иллюминации

Для начало сохраним карту FG. Раздел Final Gather Map, включаем галку – «Read/Write File», потом жмем по кнопке с точками и указываем имя и место, куда сохраниться карта:

image0163

после чего жмем кнопку «Generate FG Map File Now» и ждем процесс генерации.

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

Аналогично делаем для GI:

image0171

ставим галку, указываем имя файла и жмем на генерацию.

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

Опять ставим галки в Read/Write File на обоих алгоритмах (или проверяем, что они стоят если отменяли действие)

Проверяем, что указан наш сохраненный файл  и в алгоритме для FG «замораживаем» карту нажав на «замочек»:

image0182

теперь смело жмем кнопку РЕНДЕР, замечаем что нет процесса генерирования фотонов и FG:

image0192

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

Многие сейчас могут возмутиться:

«А как же сама концепция переноса цвета материала фотонами !!! мы ее убили на корню !!! а люди писали алгоритмы, работали!!!»

Во-первых – ничего и не убили, кто мешает назначать всем материалам один серый/белый цвет, а  пол можно сделать немного желтоватым :-)

А во-вторых, давайте обратимся к физике, как происходит процесс передачи цвета, точнее отражения спектра.

В mental ray подразумевается, что он сразу смешивается (либо полностью либо в ослабленном виде – точно не знаю это нужно изучать программу шейдера)

А в реальном мире окрашивание происходит из-за попадания света в толщу материалов и возвращения из нее уже с отфильтрованным спектром, даже самые «непрозрачные материалы» имеют прозрачность на срезе  очень маленькой толщины, но основная масса  света отражается от полированной поверхности сразу, не проникая во внутрь и чем плотнее материал, тем больше.

image0202

поэтому камни будут отражать в основном белый цвет (цвет источника точнее) металлы немного его подкрашивать, пластики еще больше смешивать со своим цветом, ну а стекло… и так понятно.. там больше каустика,   кроме того на цвет отражение еще влияет качество полировки, шероховатые поверхности больше окрасят отраженный свет, полированные меньше.

Пока плотность материала мы в Максе задавать не можем, а в предустановленных материалах она видно работает не так хорошо, как нам хочется. Поэтому придется имитировать GI описанными выше способами, либо для большей реальности можно включить эффект каустики (это и есть черная стрелка на рисунке, мы привыкли считать что каустика это только у стеклянных объектов, а это еще и зеркальные блики) либо пользоваться материалами mental ray на основе подслойного рассеивания – группа SSS.

Теперь присмотримся ко второй проблеме.

На рисунке номер 7 стена и колонны как бы сливаются, точнее на них теряется объем – картинка замылена. Корень проблемы в некачественном освещении фотонами GI. Прямой свет от ИС дает ярко выраженные тени, подчеркивая объем элементов сцены. С фотонами немного сложнее – они не дают теней, тени получаются на тех местах, где меньше всего попало фотонов, соответственно, чем меньше фотонов (и больше площадки приема фотонов – семплы) тем меньше контрастность.

Возьмем, например помещение, которое освещается только непрямой иллюминацией  и в нем установлена конструкция с неровными поверхностями, я сделал что-то вроде лестниц:

image021_s

и сделаем рендер, включив GI, но не меняя количества фотонов:

image023_s1

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

Сидят вечером три работника в сфере CG, и обсуждают свои проекты.

Первый говорит:

-   Сегодня закончил сцену, осталось обсчитать с 10 млн. фотонов, дня через три закончу.

Второй отвечает:

-   Тоже все закончил, но не хватает мощности компа, доставлю память и закончу проект.

Сидят жалуются на быстродействие техники, а потом спрашивают третьего:

-   А ты чего молчишь? как ты борешься со сложными обсчетами?

-   А я использую Ambient Occlusion! Все сдал и завтра в отпуск.

Давайте и мы не будем решать проблему экстенсивно, а воспользуемся имитацией глобального освещения на материале.

Если используются материалы группы ProMaterials, то в них есть опция Special Effects, в которой и можно включить Ambient Occlusion

image0251

Параметр samples это качество просчета – чем больше, тем лучше.

Параметр Max Distance один из основных – это дистанция, с которой происходит учет рядом стоящей геометрии для формирования эффекта глобального освещения (со всех сторон).  Если мы хотим показать эффект явно, то тут нужно установить расстояние до соседнего объекта, а если просто хотим подчеркнуть геометрию объектов (как в нашем случае) достаточно от 10см до полуметра. Ниже параметры смешивания и размытия, нам сейчас они не очень нужны, так как функция АО второстепенна.

Если используется материал не из группы ProMaterials, то придется диффузный цвет смешивать с шейдером АО, желательно по карте Falloff. А в некоторых материалах и материальных шейдерах есть слот Ambient, в который и нужно установить шейдер Ambient/Reflective Occlusion и настроить дистанцию:

image0261

ни в коем случае не оставляете дистанцию по умолчанию (равна 0) для закрытых помещений, если параметр нулевой, то просчет материала происходит с максимального расстояния (с фона сцены) и с учетом стен помещения вы получите полностью затемненный материал. Параметр Samples, аналогично – качество. Остальные параметры в настройке для нашего случая не нуждаются.

Итак, добавляем Ambient Occlusion, который работает очень быстро и не трогаем количество фотонов:

image0271

согласитесь есть разница! Учитывая, что рендериг по времени почти не увеличился.

Перейдем к третей и четвертой проблеме, они взаимосвязаны.

Присмотритесь к рисунку (№ 8) у верхнего отверстия на потолке, если присмотреться есть круглое светлое пятно.

Для выявления этого эффекта я прорублю два окна и немного испорчу потолок у помещения:

image028

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

На одну из колонн у окна я поставил материал Raytrace. Вообще-то mental ray поддерживает визуализацию стандартных материалов 3D Max, настраивая поверхность этого материала я не трогал шейдер фотонов, а он оказывается настроен не корректно! Поэтому от колонны отразился несбалансированный поток фотонов, который и принялся семплом, создав площадку, ярче фона.

Вывод – желательно пользоваться материалами mental ray, а если у вас есть любимый и настроенный старый материал, позаботьтесь о настройке шейдера фотонов как мы делали выше в обсуждении первой проблемы. Но это частный случай. Общее конечно в настройке семплов и количества фотонов.

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

Разберем эффект на самом частом и явном примере. Такие пятна как правило появляются под подоконниками, где должно быть по умолчанию темно, а mental почему то там ставит такие пятна. Вот схемка их образования:

image029_s

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

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

Оптимальный расчет можно сделать так:

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 фотонов, плюс еще некоторая настройка окружения:

image0301

В итоге время рендера вместе с генерацией карт освещения на процессоре 2х2Ггц -  4 минуты 31 секунда (148 тыс полигонов – деревце за окном прибавило)

Согласитесь это лучше чем генерировать часами миллионы фотонов и получать минимальные результаты.

В конце урока оговорюсь опять – все это результаты собственного опыта и расчетов и я не претендую на сто процентную правильность.

На этом уроки по освещению заканчиваю, но это не значит, что не будет уроков по другим темам.

С уважением, КАА

kaa936@rambler.ru

Задать вопросы и обудить урок можно на форуме.




Комментарии (3) »

  1. Урок очень понравился!

    Comment by Саша — 20.09.2010 @ 10:43

  2. но ведь налицо явный пересвет!

    Comment by Елена — 02.12.2011 @ 05:36

  3. надо попробовать! а как избежать смешивания цветов с радиосити?

    Comment by женя — 11.11.2012 @ 07:42

RSS-лента комментариев к этой записи. TrackBack URL

Оставить комментарий