Фотонные карты (Photon map)
Идея фотонных карт (ФК) проста - от источника света
во всех направлениях излучаются порции энергии света - "фотоны". Каждое
направление отслеживается (трассируется) до столкновения с ближайшим
объектом сцены и здесь моделируется "взаимодействие" фотона с
поверхностью. Результат взаимодействия записывается в специальную базу
данных, которая и является собственно фотонной картой.
Под взаимодействием подразумевается, что фотон может поглотиться
поверхностью, отразиться от нее зеркально или диффузно или пройти через
прозрачную поверхность в соответствии с законом преломления или
диффузно. Какое именно событие произойдет, зависит, во-первых, от
свойств поверхности (диффузные, отражательные и прозрачные свойства и
коэффициенты материалов), во - вторых - от результата "русской рулетки".
Русская рулетка - генератор случайных чисел,
использующий сумму коэффициентов диффузного отражения, зеркального
отражения и коэффициента прозрачности. Поскольку вероятность всегда
нормирована к единице, сумма этих коэффициентов тоже не должна
превышать единицы. Именно это обеспечивает параметр Energy preservation
mode материала VRay (при этом для RGB считается, что 0-255
соответствует диапазону 0-1) и возможно именно поэтому фотонные карты в
VRay можно создать только для поверхностей с материалами типа VRayMtl.
Суть "русской рулетки" - чем больше значение того или иного
коэффициента, тем больше вероятность, что произойдет соответствующее
ему событие - поглощение, отражение или преломление.
После взаимодействия фотон трассируется по новому
направлению до следующей поверхности, где все снова повторяется.
Глубина трассировки задается в VRay параметром Bounces закладки VRay:
Global Photon map. При достижении заданной глубины (количества
взаимодействий фотона с объектами), отслеживание фотона прекращается. В
фотонных картах всех поверхностей, с которыми взаимодействовал фотон,
сохраняется информация о координатах столкновения, энергии фотона и его
направлении прилета. Фотонная карта для поверхности создается только в
том случае, если она обладает ненулевыми диффузными свойствами.
Для успешного использования фотонных карт нужно
особенно четко понимать одну вещь - один отдельный фотон не может
корректно определить освещенность точки. Для определения освещенности
точки используется сбор некоторого количества фотонов, ближайших к
координатам точки, и суммирование их энергий с определенными весовыми
коэффициентами. Радиус сбора задается параметром Search distance
закладки VRay: Global Photon map.
Параметры настроек фотонной карты
Чем больше фотонов собирается, тем точнее оценка
освещенности точки. Но это "палка о двух концах" - если плотность
фотонной карты мала, сбор большого количества фотонов приведет к
размыванию освещенности. По умолчанию VRay использует Auto Search dist
- сам ищет оптимальный радиус сбора фотонов, при этом Search dist
недоступен для редактирования. Auto Search dist к применению не
рекомендуется - его нужно отключать и использовать собственные значения
для Search dist.
Еще одно средство в борьбе с размыванием освещенности
- параметр Max. photons, определяет число собираемых фотонов, а не
радиус сбора. Различие Search dist. и Max. photons состоит в том, что
при установленном значении Search dist будет меняться количество
реально собираемых фотонов в зависимости от плотности фотонной карты.
При установленном значении Max. photons число собираемых фотонов будет
неизменно, а изменяться будет радиус сбора в зависимости от плотности
фотонной карты.
При совместном использовании, эти параметры
конкурируют между собой по принципу "кто быстрее". Если в данной точке
поверхности быстрее собирается число фотонов, указанное в Max. Photons,
значение радиуса сбора игнорируется. Если в пределах заданного радиуса
не удается собрать заданное число фотонов, сбор прекращается, значение
Max. Photons игнорируется, а число собранных фотонов определяется
плотностью в заданном радиусе Search dist.
На практике обычно используется один из этих
параметров - Search distance (Max. Photons выставляется в 0, что
заставляет VRay игнорировать его). Однако принцип конкуренции можно
использовать для того, чтобы заставить работать обе настройки в
зависимости от плотности фотонной карты. Если выставить значение Max.
photons равным числу фотонов, собираемых в пределах Search dist. в
наименее плотных частях фотонных карт, то для областей с более высокими
плотностями будет срабатывать ограничение Max. Photons, а для областей
с низким значением плотности - ограничение Search distance. Это
приведет к тому, что радиус сбора фотонов будет изменяться в пределах
сцены в зависимости от плотности фотонных карт, что уменьшает
размывание светотеневых переходов и особенно - в области средних тонов.
Хотя фотонная карта дает физически точную картину
распределения света в сцене, для достижения точных результатов
требуется высокая плотность фотонных карт, то есть - испускание
большого их количества. К сожалению, 32-битная операционная система
современных персональных компьютеров ограничивает количество доступной
памяти 2 гигабайтами и для системы, и для запущенных в ней процессов,
что серьезно ограничивает возможности применения фотонных карт. Когда
мы все будем работать на 64-битных ОС с их 8 терабайтами на процесс,
возможно все GI будет считаться только фотонами .
А пока 8-10 миллионов записей о фотонах, в зависимости от сложности
сцены, являются абсолютным пределом объема фотонной карты. И опять, в
VRay используется очень интересное решение, позволяющее до некоторой
степени преодолеть ограничения на память.
Параметр Max. density закладки VRay: Global Photon
map позволяет "сжимать" данные фотонной карты. Делается это следующим
образом. Вместо того чтобы записывать всю информацию
(энергия-направление-координаты, объем одной записи составляет 30 байт)
о каждом фотоне в карту сначала анализируются уже имеющиеся записи.
Если вблизи координат прилетевшего фотона уже имеется запись о
"подходящем" фотоне, энергия нового фотона просто суммируется с
энергией старой записи. Таким образом, энергия фотона "бесплатно"
сохраняется в фотонной карте. Степень близости и определяется
параметром Max. Density. Чем больше значение параметра, тем больше
радиус, в пределах которого просматривается фотонная карта и тем больше
вероятность нахождения подходящего старого фотона. Если Max. Density =
0, все фотоны сохраняются в карте: суммирование отсутствует, полностью
записываются координаты, направление и энергия для каждого фотона. Если
в сцене используются миллиметры в качестве единиц измерения, то
значения Max. Density = 5 или 10 вполне достаточно, чтобы обработать
излученные 50-100 миллионов фотонов. Остается все же один вопрос - что
подразумевают разработчики под "подходящим" фотоном? Имеется ли в виду
только близость координат, или учитывается также схожесть направлений и
энергий фотонов?
Степень сжатия фотонной карты не лучшим образом
сказывается на качестве изображения. Это следует из взаимосвязи Max.
Density и Search dist. - увеличение Max. Density неизбежно приводит к
увеличению радиуса сбора фотонов, то есть - к увеличению размывания
светотени. Кроме того, суммирование фотонов в пределах Max. Density
также приводит к размыванию деталей освещенности. Поэтому, на практике
стремятся к наименьшему из возможных значений Max. Density, при котором
достигается требуемая плотность фотонной карты.
Еще одной замечательной возможностью VRay являются
алгоритмы отработки границ объектов для фотонных карт. Поскольку одними
только фотонами невозможно получить непрерывную четкую линию границы
объекта или границы стыков поверхностей, VRay предлагает два способа
получения четких границ. Первый - Convex hull area estimate,
приблизительно аппроксимирует освещенность границы по ближайшим
фотонам. Сами разработчики довольно прохладно относятся к этому методу,
тем не менее, из практики известно, что Convex hull работает довольно
хорошо. Convex hull работает лучше, если параметр Max. photons имеет
ненулевое значение.
Рис.02-05d. Фотонная карта с включенным параметром
Convex hull area estimate. Сравните с рис. 02-05b - отсутствует
почернение ребер, углов и стыков.
Второй способ - использовать для расчета освещенности
границы direct computation. Достигается указанием значения Retrace
threshold - расстояния от границы, откуда начать расчет и Retrace
Bounces - количество рассчитываемых отскоков, оно должно быть равным
параметру Bounces фотонной карты. Этот метод требует большего времени и
не всегда дает лучшие результаты. Кроме того, иногда граница все же
может в результате расчетов несколько отличаться по цвету от остальной
поверхности, что потребует корректировки Retrace Bounces (меньше -
темнее, больше - светлее) и дополнительных расчетов. Оба способа
достаточно широко используются.
Store direct light
позволяет сохранить в фотонной карте информацию о
прямой освещенности. В терминах фотонной карты первое столкновение
каждого фотона с поверхностью и есть, по сути, прямое освещение (не
путать с первым диффузным столкновением, который является вторым
столкновением фотона с поверхностью). Обычно, самый первый отскок
фотона в картах не сохраняется, чтобы исключить дублирование расчетов
прямого освещения.
Рис.02-05e.
Фотонная карта с включенным параметром Store direct
light. Сравните с рис. 02-05b, рассчитанной без Store direct light и с
рис.02-05c, рассчитанным с прямым освещением и фотонной картой.
Convert to irradiance map
предназначен для промежуточного вычисления
освещенности по фотонной карте. Позволяет ускорить расчет irradiance
map. Использование конвертации равносильно "запеканию" фотонов карты в
количестве Interp. samples в световые пятна, а параметр Interp. samples
определяет используемое для этого количество фотонов вблизи точки.
Рис.02-05f.
Фотонная карта с включенным параметром Convert to
irradiance map. Сравните с рис. 02-05b, рассчитанной без Convert to
irradiance map.
Рис.02-05h.
Фотонная карта с Convex hull area estimate - on,
Store direct light - on, Convert to irradiance map - on. Сравните с…
думаю, вы уже знаете с чем
Для эффективного использования фотонной карты следует иметь ввиду следующие ее основные свойства:
1. ФК не зависит от положения камеры, от разрешения
изображения и от настроек антиалиасинга. Это позволяет рассчитать
фотонную карту требуемой плотности один раз, сохранить ее в файл и
многократно использовать и настраивать без пересчета. Например, можно
использовать для настройки фотонной карты изображение низкого
разрешения с низким антиалиасингом. Пересчитывать фотонную карту не
нужно при изменении положения камеры или при изменении разрешения
изображения. И надо пересчитывать при любых других изменениях в сцене:
свойств материалов и источников света, изменении геометрии или
положения объектов - всего того, что меняет освещенность в сцене.
2. Параметры Search dist. и Max. photons можно менять
без пересчета фотонной карты. Это позволяет посчитать фотонную карту с
требуемой плотностью один раз, сохранить ее в файл, потом менять эти
параметры и выполнять рендер с загрузкой фотонной карты из файла. Очень
удобно для настройки фотонной карты. Почему это возможно - понятно,
Search dist. и Max. photons всего лишь определяют количество фотонов
для оценки освещенности и ничего не меняют в самой фотонной карте.
3. Количество излучаемых фотонов задается в свойствах
источников света на закладке VRay Systems>Lights settings включением
галочки Generate diffuse и указанием Diffuse subdivs. Максимальное
количество излучаемых фотонов будет определяться квадратом количества
subdivs, а истинное - игрой пороговых параметров QMC. Для расчета
фотонных карт необходимо также, чтобы в свойствах объектов Object
settings той же закладки были выставлены галочки для Generate GI и
Receive GI.
4. Фотонная карта может быть рассчитана только для материалов типа VRay Mtl. С другими типами материалов ФК не работает.
5. Фотонная карта не работает с источником света типа
SkyLight и с HDRI. Расчет освещения от SkyLight и HDRI может быть
выполнен только irradiance map или direct computation.
6. Фотонная карта в VRay предназначена только для
расчета освещенности от многократных переотражений света, начиная со
второго и выше. Она не предназначена для расчета первого диффузного
отскока, то есть - освещенности от первого диффузного отражения.
Наличие включения фотонной карты для расчета первого отскока закладки
VRay: Indirect Illumination обусловлено только целями настройки самой
фотонной карты.
7. Удивительно, но факт - величина Bounces фотонной
карты незначительно влияет на количество взаимодействий фотонов с
поверхностями (и на объем фотонной карты). Такая зависимость
определенно должна быть сильнее - чем дольше прослеживается путь
фотона, тем больше событий мы должны наблюдать. Возможно, сказывается
влияние настроек QMC Sampler. Зато, как показывает практика, на объем
фиксируемых в фотонной карте событий очень существенно влияет параметр
Multiplier для Secondary bounces закладки VRay: Indirect illumination
(GI). Эти два свойства следует учитывать при планировании плотности
фотонной карты.
8. Включение/отключение Convex hull area estimate,
Store direct light и Convert to irradiance map требует пересчета
фотонной карты.
Irradiance Map
Параметры настроек irradiance map
Interpolation type
Sample lookup
Randomize samples
Check sample visibility
В руководстве пользователя к VRay имеется галерея примеров, наглядно и
достаточно полно демонстрирующая влияние каждого из вышеописанных
параметров на irradiance map и конечное изображение. Рекомендую.
Mode
Несмотря на то, что irradiance map менее гибка, чем
photon map и практически любое изменение настроек или параметров сцены
требует ее пересчета, затраты могут быть минимизированы за счет
различных режимов Mode. Irradiance map не нужно пересчитывать при
изменении настроек antialiasing и при настройке Color mapping.
Что касается настроек пороговых величин для параметров отбора точек -
Clr. thresh, Nrm. Thresh и Dist. thresh, то поскольку VRay использует
некоторые абстрактные величины (Generic units) их значения довольно
трудно связать с реальными единицами изменения цвета, углов нормалей
или расстояний. Спасает только наличие Irradiance map preset для
рендеров с различными степенями качества. Выбрав из списка подходящий
набор настроек, их можно использовать как отправную точку для
собственных настроек пороговых величин.
Учитывая все вышесказанное, можно предложить следующий метод расчета освещенности трехмерной сцены при помощи VRay.
1. Постановка прямого освещения. Выбираются такие
типы и количество источников света, чтобы они максимально
соответствовали поставленным условиям, в частности - требованию
реалистичности освещения. Затем, для света настраивается только прямое
освещение регулированием настроек источников света - multiplier, color
и других. На этом этапе все другие типы освещения (GI) отключаются.
Правильно настроенное прямое освещение - залог хорошего рендера,
поскольку именно прямое освещение является основным, определяющим.
2. Настройка и расчет фотонной карты с сохранением в файл.
3. Настройка и расчет irradiance map для first
diffuse bounce совместно с подгружаемой из файла фотонной картой для
secondary bounces. После настройки - сохранение рассчитанной irradiance
map в файл.
4. Финальный рендеринг с тонкой настройкой светового
баланса при помощи VRay: Color mapping и выбором необходимого уровня
антиалиасинга. Сцена
Для настройки я выбрал сцену, которую можно найти в Интернете по адресу http://hdri.cgtechniques.com/~sponza/files.
Выбор именно этой сцены обусловлен тремя причинами.
Оригинальная сцена создавалась в LightWave. На сайте есть ее версия,
адаптированная под 3ds max с материалами, с ней и будем работать. Вот
как это выглядит в scan-line рендере 3ds max:
Материалы и геометрия
VRay, как впрочем, и другие рендер-программы, предъявляет ряд
требований к геометрии сцены. Геометрия обязана быть "правильной", то
есть должны быть соблюдены обычные требования правильного
моделирования. Геометрия не может содержать длинных тонких полигонов
(полос), а стыки поверхностей должны быть выполнены без зазоров.
Наличие зазоров - главная причина просачивания света сквозь углы
(появления самосвечения в углах) и стыки поверхностей. Лучше, если
отдельная модель представлена отдельным объектом. Например, при
моделировании комнаты образующую коробку лучше сделать одним объектом,
а не состоящей из шести отдельных объектов-боксов. При моделировании
нужно использовать объемные "строительные" блоки, например, если стена
в реальном мире всегда имеет толщину, то и в сцене не нужно пытаться
моделировать ее плоскостью, не имеющей толщины.
Лично я избегаю использования булевых операций для создания оконных и
дверных проемов, поскольку они часто создают неоптимальную
результирующую полигонную сетку. Лучший метод моделирования, который
можно порекомендовать - работа с Editable poly.
VRay не так требователен к геометрии, как программы, использующие
radiosity, тем не менее, хорошее моделирование - залог беспроблемного и
быстрого расчета в нем. Поэтому анализ и исправление геометрии сцены
при необходимости - первое, что следует сделать при подготовке к
рендеру.
Достаточно важным, хотя и некритичным моментом является выбор единиц
измерения в сцене. При использовании VRay наиболее удобно работать с
миллиметрами. Это обусловлено диапазоном изменения значений некоторых
его параметров, а использование миллиметров увеличивает точность работы
с ними. Например, минимальное значение параметра Max. density фотонной
карты составляет 0.001 в выбранной системе единиц измерения. Но 0.001
метра и 0.001 мм - совсем разные вещи. Конечно, столь высокая точность
Max. density для фотонной карты неактуальна, но VRay имеет множество
других параметров, диапазон изменения которых также основан на
выбранной системе единиц. Используемую систему единиц всегда можно
поменять на другую, например, при помощи утилиты Rescale World Units 3
ds max. Вот только вполне может оказаться, что большую часть уже
выполненной работы придется пересчитывать.
Следует также придерживаться принципа соответствия размеров объектов
сцены размерам реальных объектов. Необходимость этого обязательного
требования продиктована использованием закона затухания интенсивности
освещения с расстоянием в любой современной рендер-программе,
рассчитывающей Global Illumination.
Поскольку я собираюсь использовать фотонные карты, необходимо настроить материалы.
Как известно, VRay рассчитывает фотонные карты только для материалов
типа VrayMtl. Поэтому необходимо выполнить преобразование стандартных
материалов 3ds max, которые используются в нашей сцене, в материалы
типа VrayMtl.
Преобразование материалов довольно тривиально, нужно только изменить
тип на VrayMtl, воспроизвести диффузные свойства материалов и положить
в соответствующие слоты растровые карты. Поскольку некоторые материалы
в оригинале имели bump, он также настраивался и в новых материалах, с
теми же количественными значениями.
Объем геометрии сцены составляет 66 454 полигона, это вполне приемлемо.
Количественные показатели геометрии и материалов важны - на них
расходуется память, которая не может быть в дальнейшем перераспределена
для других целей, например - для фотонных карт. Чем больше памяти
отводится под геометрию и материалы, тем меньше ее остается для
фотонов, поскольку Windows не может адресовать больше 2 гигабайт
памяти. 2 Гб - это все, что доступно и системе и запущенным
приложениям. Если сцена слишком велика, рендер вообще может стать
невозможным. Планирование и оптимизация размера сцены - еще один
немаловажный момент подготовки к расчетам.
Свет
Поскольку особенности нашей сцены требуют воспроизвести дневное
освещение, я счел целесообразным использовать два источника света (ИС).
Один из них имитирует солнце, второй - рассеянное освещение от
небесного свода.
Для моделирования солнечного освещения подойдет любой ИС, который
отвечает следующим трем обязательным условиям: у него отсутствует спад
интенсивности освещения с расстоянием; его лучи параллельны друг другу;
он обладает световым фронтом, который можно представить частью
плоскости прямоугольной или круглой формы.
В 3 ds max эти требования почти однозначно приводят к выбору ИС типа
Target Direct. VrayLight не подходит, поскольку не может обеспечить
параллельность лучей света (второе требование). Даже при отключении
Ignore light normal в его настройках, световой фронт будет сферическим.
Последнее приведет еще и к потерям излучаемых фотонов, то есть - к бесполезному увеличению времени расчетов.
Требование отсутствия затухания освещения с расстоянием не противоречит
принципу физической корректности, поскольку речь идет именно о Солнце.
В компьютерной графике учитывается только одна из возможных причин
затухания - вследствие изменения плотности потока световой энергии в
результате увеличения площади светового фронта при его распространении
(увеличении радиуса сферы светового фронта со временем, или - просто
расстояния от источника света).
Это и приводит к затуханию с квадратом расстояния, а изменение
интенсивности освещения вызвано только изменением расстояния (радиуса).
Если речь идет о Солнце, то расстояние, которое лучи проделали от
Солнца до Земли, просто громадно по сравнению с изменениями радиуса
светового фронта в пределах Земли. Поэтому и изменение интенсивности
освещения в пределах земных масштабов расстояний, будь то сотни
километров или десятые доли миллиметра, ничтожно малы.
Другими словами, световая сфера, дошедшая от Солнца до Земли настолько
громадна, что ее поверхность можно считать плоской (причем с гораздо
большим основанием, чем можно считать плоской поверхность Земли),
изменение плотности светового излучения ничтожно малым, а лучи света -
параллельными. И это именно физически
корректно для Солнца, как для источника освещения. Совсем другое дело -
обычные, земные источники света. Относительное изменение радиуса
световой сферы для них всегда велико, заметно, и рассчитывать его нужно
по закону квадратичного затухания.
Настройка положения и высоты Target Direct в сцене выбиралась так,
чтобы наиболее интересно осветить ту часть, которая видна в камере.
Волновой фронт выбран прямоугольным (Light Cone>rectangle) для
облегчения его проецирования на интересующую часть сцены так, чтобы
минимизировать потери при излучении фотонов.
Затухание обязательно отключаем (Decay>Type>None). В качестве
типа теней был выбран VRayShadow со значениями по умолчанию.
Второй источник света должен моделировать рассеянное освещение от
небесного свода и потому обязательно должен быть пространственным (тип
Area). В качестве такового можно выбрать ИС типа Skylight из набора 3ds
max, и неплохо было бы с ним использовать подходящее изображение
небесного свода в формате HDRI. Однако, учитывая то, что фотонные карты
не могут работать со Skylight и HDRI, целесообразнее взять вместо него
ИС типа VrayLight, которым и воспроизвести световой фронт. Впрочем,
вариант с использованием Skylight+HDRI вовсе не исключен, просто здесь
и сейчас я его рассматривать не буду.
Настраиваем VrayLight таким образом, чтобы он имел прямоугольную форму
с размером, соответствующим размерам прямоугольного отверстия сверху
дворика и располагаем его чуть ниже уровня крыши. Такое расположение
минимизирует потерю фотонов, а освещение внешнего края крыши дома
возложим на VRay Environment. Затухание освещения не отключаем - это не
Солнце.
рис. 02. Настройки VRayLight
Наконец, для того, чтобы воспроизвести цвет неба, выставлен белый цвет для Environment 3ds max.
рис. 03. Вид сцены с положением источников и камеры.
Разрешение рендера устанавливаем 640х480, этого
вполне достаточно для целей настройки освещения. После настройки,
непосредственно перед финальным рендером, его нужно изменить на
требуемое. Также минимизированы и параметры антиалиасинга (далее - AA):
тип fixed rate, subdivs=1, можно и еще грубее.
Теперь, после расстановки освещения, необходимо
настроить множители (Multiplier) для их интенсивностей. Эту операцию
следует выполнять в несколько этапов. На первом - только для прямого
освещения, это мы сейчас и сделаем.
Выключаем расчет GI у VRay и начинаем
экспериментировать с настройками интенсивности, выполняя рендеры только
с прямым освещением и регулируя Multiplier у ИС. Для данной сцены я
остановился на следующих значениях: для Target Direct - 3, для
VRayLight - 5 и белый Color для обоих (255, 255, 255). При настройке
интенсивности света также с самого начала использовался
экспоненциальный контроль экспозиции из VRay: Color mapping, тип - HSV
Exponential, Dark Multiplier =1.6, Bright multiplier =1, Affect
background off.
рис. 04. Так выглядит сцена с настроенным прямым освещением.
Экспоненциальный контроль хорош тем, что позволяет
убирать засветы в сильно освещенных местах. В этой сцене я хочу
воспроизвести ощущение достаточно яркого солнечного дня, в результате
получается засвет в области крыши при приемлемой освещенности остальной
сцены. Проблему помогает решить экспоненциальный контроль освещения.
Вообще, необходимость в контроле засветов/затемнений вызвана тем, что
современные рендеры рассчитывают физически корректные значения
интенсивностей, которые далеко не всегда укладываются в "прокрустово
ложе" стандартной модели RGB.
рис. 05. Параметры группы Color mapping помогают управлять экспозицией освещения.
Всего имеется три типа контроля: Linear multiply
(линейный), Exponential (экспоненциальный), HSV exponential
(экспоненциальный с сохранением насыщенности цвета). Различие между
Exponential и HSV exponential состоит в насыщенности тонов после
корректировки, при использовании Exponential изображение получается
более "сдержанным", блеклым. На последующих этапах, после расчета
фотонных карт и irradiance map, возможно, потребуется дополнительно
подкорректировать освещение. Это вполне можно выполнить таким же
образом и без пересчета карт.
|