В этом уроке мы рассмотрим работу с материалами Hydra. В качестве нашего подопытного будет выступать небезызвестный заяц, помещенный в cornell box.
Рис. 1. Оригинальный вид сцены в 3DS Max.
Один из наиболее важных моментов, на которые следует обратить внимание - в Hydra материалы имеют аддитивную модель. То есть, если материал имеет несколько параметров (diffuse, specular, reflection, transparency), то освещение от них всех будет просто складываться. При этом, для соблюдения физической корректности материала вам самим необходимо следить за тем, чтобы сумма всех коэффициентов по каждому из цветов не превышала 1. В противном случае, материал может отражать больше энергии чем на него падает, что не является физически корректной моделью.
Например, если вы хотите, чтобы ваш материал отражал ровно 75% энергии зеркально, недостаточно просто поставить reflection параметр в (0.75, 0.75, 0.75). Необходимо еще учесть, что вклад от всех остальных параметров вы хотите сделать меньше, поэтому параметр diffuse должен быть при этом умножены на 1-reflection, то есть на (0.25, 0.25, 0.25). Мы пока что не будем рассматривать случаи преломляющих материалов и материалов, для которых имеет место подповерхностное рассеивание. На самом деле как именно уменьшать диффузную составляющую - ваше дело. Это зависит от того, чего вы хотите достичь.
Важно лишь понимать, что все коэффициенты (diffuse, specular, reflictivity, transparency и translucency{пока что отсутствует}) напрямую задают в процентах распределение энергии. Если сумма этих коэффициентов больше единицы, материал не будет физически корректным. Хотя это может вас и не волновать. Еще один важный момент - если у вас в сцене материалы, для которых сумма коэффициентов все же оказалась больше 1, результирующее изображение будет зависеть от глубины трассировки.
Такая модель может Вам показаться по началу неудобной. Однако, со временем вы поймете, что она значительно упрощает представление материалов, т.к. числа, которые вы помещаете в параметры напрямую используются в алгоритме для учета того или иного параметра. Такая модель более интуитивна и вы быстро к ней привыкните.
Еще одной важной концепцией материалов в Hydra являются значения параметров по умолчанию. Если параметр не задан, он всегда принимает свое значение по умолчанию. Такая концепция позволяет не указывать вам всевозможные параметры материала, если вам нужна какая-то простая модель. Практически для всех параметров значение по умолчанию - ноль. Однако, степень косинуса (где она есть) всегда имеет значение по умолчанию равное 1 на 10 в 6-ой степени (миллион), изображая таким образом идеальное зеркальное отражение. Исключение составляют некоторые другие параметры, о них будет упомянуто в соответствующем разделе.
Вкладка emission
Emission используется только для мешей, являющихся ичтониками света. Если вы хотите добавить светящийся меш, то его не нужно отдельно прописывать в источниках света. Достаточно просто указать emission у материала этого меша. Если у материала задан ненулевой параметр emission, то он автоматически становится только излучающим.
Вкладка diffuse
Отвечает за ламбертовскую часть BRDF модели.
<diffuse> <color sid="diffuse">0.725490 0.501961 0.831373 1.000000</color> <radiance> 1.0 </radiance> </diffuse>
Рис. 2. Рендер диффузного кролика.
Параметр "diffuse_radiance" отвечает за то, насколько на данный материал влияет вторичное рассеянное освещение. Для соблюдения физической корректности материала этот параметр должен быть всегда строго равен 1.0 (или он может быть не задан, тогда он получит свое значенние по умолчанию равное 1). Заметтье, как изменилось влияние вторичного освещения на модель кролика.
Рис. 2. Рендер диффузного кролика. diffuse_radiance=2.
Если для вашей модели в 3DS Max имеются текстурные координаты, то вы можете добавить текстуру, просто указав путь к ней. Путь указывается относительно модельки (.max либо .dae файла) или абсолютный.
<diffuse> <color sid="diffuse">0.725490 0.501961 0.831373 1.000000</color> <radiance> 1.0 </radiance> <texture> D:/data/my_textures/texture01.bmp </texture> </diffuse>
К сожалению наш кролик не имеет корректно сгенерированных текстурных координат, поэтому к теме текстур мы вернемся позже, в разделе про тектуры.
Вкладки specular и reflection (reflectivity)
Эти вкладки практически идентичны. Вкладка specular отвечает за отражательную способность света, который напрямую доходит от источников света - то есть это блики. Вкладка reflection отвечает за отражательную способность света при рассчете отраженных лучей, которые, как правило, не попадают на прямую в источник света (источник света может быть точечным, например, но даже если попадают то ничего страшного, объяснение по поводу этого случая будет дано позже). Параметр reflection может называться как reflection так и reflectivity. Это одно и то же. Два способа именования сохранились по той причине, что изначально в формат COLLADA этот параметр экспортируется под именем reflectivity.
Для того чтобы освещение было физически корректным, все параметры в этих вкладках должны быть одинаковыми. То есть, по просту говоря, specular должен быть равен reflection. Однако, это не всегда удобно. По разным причинам, бывает удобно задать различные BRDF для отражений и для бликов, чтобы добиться желаемого эффекта за приемлимое время рассчета.
<hydra>
<emission> <color sid="emission">0.000000 0.000000 0.000000 1.000000</color> </emission> <diffuse> <color sid="diffuse">0.0 0.0 0.0 1.000000</color> <radiance> 1.0 </radiance> </diffuse> <specular> <color>0.2 0.2 0.2 1.000000</color> <brfd_type> cook-torrance </brfd_type> <roughness> 0.5 </roughness> </specular> <reflectivity> <brfd_type> phong </brfd_type> <color>0.65 0.65 0.65 1.000000</color> <cos_power> 256 </cos_power> </reflectivity> </hydra>
Рис. 3. Зеркальный кролик.
Для того чтобы разобраться в параметрах отражений, нам необходимо знать, как вычисляется зеркальная часть BRDF. На данный момент в рендере Hydra поддерживается 3 модели зеркальной BRDF - это модель Фонга (brfd_type = phong), Блинна (brfd_type = blinn) и модель Кука-Торренса (brfd_type = cook-torrance). Параметр cos_power - это степень косинуса в формулах Фонга и Блина. Для модели Кука-Торренса используется параметр roughness. Как известно, в модели Фонга при отражении луч не всегда идет в направлении зеркального отражения, а может немного от этого направления откланяться. Это связано с микрорельефом реальных поверхностей. Для Ламертовских поверхностей, отражение имеет косинусоидальное распределение в направлении нормали. Это приблизительно соответствует cos_power=1. Однако, для отражающих поверхностей в направлении отражения уходит гораздо больше света, поэтому эта степень обычно много больше. Для того чтобы получить "glossy reflection" нужно поиграться именно с этим параметром. Чем меньше степень, тем более отражения "glossy".
Рис. 4. Glossy reflections. reflection_cos_power = 256.
Чем меньше степень, тем более отражения "glossy".
Параметр cos_power
Итак, из-за микро-рельефа поверхности реальные материалы как правило не отражают свет строго в одном направлении.
Рис. 5. Взаимодействия света с поверхостью.
На рисунке 5 оранжевым цветом обозначена BRDF. Видно, что в направлении отражения она имеет максимум - некую долю (от англ. lobe), похожую на атомную орбиталь из книжки по химии. Но сходство не случайно. В действительности такая "орбиталь" получается при косинусоидальном распределении.
Рис. 6. Косинусоидальное распределение.
Чем выше степень косинуса, тем более резкое получается отражение, т.к. больше лучей уходит в направлении идеального зеркального отражения.
К сожалению, на данный момент glossy отражения ярких источников могут быть зашумлены и для таких сцен потребуется увеличивать максимальное число сэмплов. Glossy reflections для обычных объектов не дают шумной картинки.
Рис. 7. Glossy reflections. reflection_cos_power = 64. Вторичное освещение отключено.
Итак, параметр cos_power отвечает за степень косинуса в формуле фонга и при генерации отраженных лучей. Один тонкий момент для модели кука-торренса. Во вкладке specular параметр cos_power не указывать (т.к. он при этом просто не используется, вместо него берется roughness), однако во вкладке reflection это необходимо делать, т.к. независимо от модели материала отраженные лучи все-равно будут генерироваться с учетом распределения косинуса в степени cos_power по отношению к зеркальному лучу.
Примечание: когда параметр cos_power становится большим, из-за ошибок в вычислении с плавающей точкой могут появится артефакты. В этом случае вы скорее всего хотите получить практически идеальное зеркальное отражение, поставьте параметр cos_power=100000. Это специальный случай и он корректно обработается рендером.
Теперь несколько слов по поводу того, почему в рендере имеется разделение на specular и reflection.
В таком разделении существует некоторый смысл. Когда мы считаем specular-ную компоненту, мы сэмплируем источник света детерминированно, а при отражении в классическом path tracing-е недетерменированно. Разделение сэмплов для источника света на детерминированные и недетерминированные важно. Glossy reflection могут считаться достаточно долго из-за того, что очень небольшое число лучей попадает после переотражений в источник света. А так как источник света очень яркий по сравнению с остальными объектами, то это небольшое число лучей вносит тем не менее очень большой вклад, из-за чего появляется шум. Поэтому если вам нужен сильный эффект "highlights", снижайте степень косинуса у спекулярной компоненты, но не трогайтее ее у отражений.
<specular> <color>0.65 0.65 0.65 1.000000</color> <brfd_type> cook-torrance </brfd_type> <roughness> 0.25 </roughness> </specular> <reflectivity> <brfd_type> phong </brfd_type> <color>0.65 0.65 0.65 1.000000</color> <cos_power> 256 </cos_power> </reflectivity>
Рис. 8. Добиваемся того же самого эффекта 'highlights' за счет specular-ного освещения. Меньше шума. На картинке вторичное освещение отключено.
Параметр rougness
Подробнее о параметре rougness можно почитать здесь: http://content.gpwiki.org/index.php/D3DBook:(Lighting)_Cook-Torrance
В кратце, чем он меньше, тем более glossy поверхность и тем более размазанные на ней блики. |