понедельник, 27 июня 2011 г.

Альбедо в реалистичной визуализации.


   Всем привет. В этой статье я расскажу о понятии "Альбедо" и его значении в создании реалистичной визуализации. Начнём с теории. Вот его определение из физической энциклопедии:

   АЛЬБЕДО (от позднелат. albedo - белизна) - величина, характеризующая рассеивающую или отражательную способность поверхностей или космических тел. Используется в атм. оптике и астрофизике. В широком смысле А.- отношение потока отражённого (рассеянного) излучения к потоку падающего излучения. В теории переноса (рассеяния) излучения используется также понятие единичного А., т. е. отношение числа рассеянных во все стороны фотонов к числу падающих фотонов.

   В чём вообще смысл всего этого? Дело в основном в расчёте ГИ. Я использую термин ГИ как обобщённое название алгоритмов глобального освещения, имитирующих диффузное рассеивание. Ситуация следующая. Чем меньше это альбедо, для нас это яркость диффузного цвета в материале, тем быстрее свет будет затухать при каждом следующем отскоке от этой поверхности. А это будет влиять на реалистичность сцены в целом. Приведу пример на простых предметах.

   Возьмём теннисный стол, ракетку и мячик. Кинем мячик на стол и станем накрывать его ракеткой. В обычной ситуации мячик, отражаясь от твёрдых поверхностей, сделает десятки отражений, находясь достаточно долго в движении. А если на стол положить поролон и ракетку обклеить им же, мячик сделает от силы несколько отскоков. Вот приблизительно так же ведёт себя свет при попадании на диффузные поверхности.

   Т.е., согласно понятию альбедо, получается, что для получения более реалистичного результата максимально белая диффузная поверхность в материале рендера не должна превышать значение 96% белого, это следует из приведённой далее таблицы. Конечно, искусству законы не указ, но меня здесь интересует чисто техническая сторона вопроса.

   Я не раз замечал, что в настройках рендера скачанных сцен для врея значение мультиплая вторички ГИ ставят около 0,75. Возможно, это как раз попытка решить проблему излишнего переотражённого света ввиду того, что все материалы созданы из расчёта, что белый имеет 100% альбедо. Но, в таком случае, необходимо ещё уменьшить и первичный отскок ГИ на то же значение, на которое уменьшен отскок вторичного ГИ. Чтобы первый отскок ГИ затухал так же, как и все последующие. Такой подход весьма прост, но не очень корректен, т.к. альбедо материалов останется прежними для зеркальных и глосси отражений. Что будет влиять на реалистичность.

   В рендере Mental ray есть похожие инструменты для уменьшения интенсивности последующих отражений в алгоритме Final Gather. Это параметр – «Weight» (вес). Находится он в настройках Final Gather. Работает он именно уменьшая интенсивность каждого следующего отскока, умножая текущую интенсивность на значение веса, а не уменьшая интенсивность всей просчитанной карты ФГ. Врей работает схожим образом. Я проверил это следующим образом. Сначала считалась простенькая тестовая сцена, с диффузным цветом равным единице (100% белый) и уменьшенными, равнозначными, значениями мультиплая ГИ для первичного и вторичного отскока. В ментале соответственно - мультиплай ФГ и вес. Обзовём эти значения переменной «X». Далее считалась картинка со значением диффузии равным «Х» и единичными значениями мультиплаев ГИ. Результаты схожие, что и позволяет говорить о параметрах мультиплая ГИ в врее и мультиплая и весе в ментале как о параметрах, работающих для каждого отскока ГИ. Тест провёл с разными значениями «Х».

   К сожалению, в ментале нет подобного регулятора для фотонов. Мультиплай в настройках фотонов уменьшает интенсивность всей просчитанной карты фотонов. Т.е. остаётся использовать только ФГ с переотражениями. А это, зачастую, намного дольше при расчёте замкнутых сцен с кол-вом диффузных переотражений больше 2-х. К сведению, при просчёте сцены связкой фотоны + ФГ параметр «Weight» игнорируется так же, как и "Diffuse bounces", т.к. это параметры вторичных переотражений, реализацией которых займётся включённая опция фотонов.

   Исходя из всего вышеизложенного, самым правильным будет редактировать материалы, выставляя значение «Diffuse Level» равным значению нужного нам альбедо. Можно менять просто интенсивность цвета, но при использовании текстур, а тем более многокомпонентных карт, проще менять Diffuse Level. Это, конечно, не очень удобно, т.к. придётся лопатить все материалы, но взамен мы получаем настройку не зависимую от алгоритма ГИ и корректную визуализацию отражающих (зеркальных) поверхностей.

   Теперь испытаем нашу методику на тестовой сцене. Я буду использовать ментал рей, фотоны + ФГ.

   Итак, поехали.

   3d max 2011, mental ray, гамма 2,2. Материал Arch&Design. На всех материалах Diffuse = 1(Альбедо = 1).Я специально сделал пол красным, т.к. нас ждёт сюрприз. Дело в том, что альбедо оказывает влияние на цветовой перенос, т.е. на так нашумевший «колор блидинг». Лучше не использовать чистый цвет, т.е. имеющий 100% насыщенность, т.к. в природе таких материалов не бывает, и это повлияет на реальность визуализации. Даже минимальное уменьшение насыщенности позволит этому цвету смешиваться с другими, что отражает реальное положение дел. Я уменьшил насыщенность красного на минимально значение, с 1 до 0,992. Следующие примеры покажут, как альбедо влияет на цветовой перенос.

   Для начала рендер только с источниками, без ГИ, для понимания интенсивности начального света. В окнах - Sky Portal, за окном - Daylight (mr Sun, mr Sky).

  
   Включаем ГИ.
   3 млн. фотонов. Merge1 см. Радиус 15см. Fast Look Up – вкл. Очень рекомендую использовать мердж для фотонов и Fast Look Up для ускорения расчёта ФГ и экономии памяти. Т.к. мердж уменьшает кол-во фотонов, заменяя все фотоны в радиусе мерджа на 1 фотон с усреднённым значением. Как следствие, вся фотонная карта уменьшается в объёме информации, и поэтому ФГ производит поиск нужных значений в ней в разы быстрее. FG = Density 1, Ray 500. В материалах включён AO с галкой колор блидинга, дистанция 30 см. Цвет Shadow Color чёрный, это полный колор блидинг, без AO. Считаем.


   Мы наблюдаем типичную картину, с которой многие сталкивались. Картинке далеко до реальности именно из-за того, что выставлено слишком большое альбедо, которого вообще в природе не существует. Дело в том, что предметы, которые мы считаем белыми, на самом деле могут быть далеки от даже 90% белого. Понаблюдайте за поверхностью, про которую вы бы сказали, что она самая белая, а потом поднесите к ней лист белой офисной бумаги. Скорее всего, предмет окажется темнее бумаги. Я воспроизвёл этот тест и вот, что у меня получилось. Бумага уложена в 3 слоя, чтоб из-за просвечивающихся особенностей бумаги, стол на неё не влиял.


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

   Как видно, все предметы, которые по отдельности мне казались очень белыми, в сравнении с бумагой кажутся серыми. А ведь у такой бумаги альбедо около 0,6-0,7(в других источниках до 0,8). И стандартный потолок, которому мы обычно ставим альбедо около 0,9, в большинстве случаев тянет всего на 0,6. Возможно, появится справедливый вопрос, ведь это уже не белые поверхности, а серые. Но в природе нет понятия белый и серый, а есть способность поверхности отразить больше или меньше света. Поэтому даже серый предмет, находясь в очень тёмно серой комнате, не имеющей других поверхностей с альбедо, превышающим альбедо серого предмета и не имеющей знакомых цветовых ориентиров, типа кожи наших рук, будет казаться белым. Причиной этому будет являться наша способность адаптироваться к освещению. И поэтому, скормив физически корректному визуализатору поверхности с реальными альбедо, нужно также выполнить адаптацию яркости сцены для удобного зрительного восприятия. Другими словами – выставить экспозицию. Можно увеличивать интенсивность освещения, но в 3д максе есть удобная опция для регулирования экспозиции – Exposure Control.

   Казалось бы, простая вещь, но далее мы увидим, как меняется освещение по мере уменьшения альбедо. Ниже находится таблица со значениями альбедо некоторых материалов. В таблице указаны приблизительные значения, т.к. материалов с одноимённым названием может быть много. Например, гипс. Гипс бывает: строительный (гипсовый алебастр), формовочный (лепка, скульптура, моделирование), медицинский (более чистый) и прочие подвиды. Поэтому альбедо у них может отличаться. Таблица взята с сайта фототехнического сервера ОАО "Красногорский завод им. С.А. Зверева".



Отражательная способность различных поверхностей
Поверхность
Вид отражения
Коэффициент отражения
Окись магния
диффузное
0,96
Алебастр
диффузное
0,92
Серебро полированное
направленное
0,88--0,93
Белая гипсовая поверхность
диффузное
0,85
Снег свежевыпавший
смешанное
0,75--0,78
Стеклянное зеркало
направленное
0,72--0,85
Серебрение матовое
направленно-рассеянное
0,7
Алюминий полированный
направленное
0,65--0,75
Хромированная полированная поверхность
направленное
0,60--0,70
Алюминий матированный
направленно-рассеянное
0,55--0,60
Бумага белая матовая
направленно-рассеянное
0,60--0,70
Снег тающий чистый
смешанное
0,60--0,62
Хромирование матовое
направленно-рассеянное
0,50
Оштукатуренная поверхность
диффузное
0,40--0,45
Шелк натуральный
смешанное
0,35--0,55
Тес (дерево свежее)
направленно-рассеянное
0,35--0,42
Кожа лица
смешанное
0,25--0,35
Песок белый сухой
диффузное
0,24--0,32
Глина желтая
диффузное
0,16
Тес старый, посеревший
направленно-рассеянное
0,12--0,16
Песок белый мокрый
диффузное
0,11-0,20
Асфальтовое покрытие сухое
смешанное
0,10--0,18
Чернозем сухой
диффузное
0,07--0,08
Асфальтовое покрытие мокрое
направленно-рассеянное
0,06--0,08
Лиственная растительность летом
направленно-рассеянное
0,09--0,12
Хвойная растительность
диффузное и направленно-рассеянное
0,08--0,12
Лиственная растительность осенью
направленно-рассеянное
0,15--0,30
Черное сукно
направленно-рассеянное
0,10--0,12
Чернозем мокрый
направленно-рассеянное
0,02--0,05
Черный бархат
диффузное
0,01--0,03

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

   Альбедо = 0,85 (по таблице белая гипсовая поверхность). Мне казалось, мой лев на фотографии из гипса, но сами видите, насколько он темнее бумаги. Поэтому в таблице приведён какой-то ну очень белый гипс. Ставим в материале Diffuse Level = 0,85. Тюль просвечивается, поэтому цвет транслюценции тоже нужно уменьшать пропорционально цвету диффузии, т.к. просвечивает она собственную диффузию. Настройки тюли: Прозрачность = 0,5. Цвет = falloff (настройки по умолчанию). Транслюценция = 0,5 (просвечивает 50%) и цвет = 0,85. Далее этот цвет тоже будем уменьшать.


Альбедо= 0,6.


Альбедо= 0,42 (оштукатуренная поверхность).


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

Альбедо= 0,2.



Меньше ставить я не буду, т.к. думаю, смысл происходящего понятен.

   В связи с уменьшением интенсивности диффузии, нужно пересмотреть настройки силы отражений – «Reflection» в материалах. Их, скорее всего, нужно сделать меньше, если вы настраивали их на глазок, основываясь на интенсивности диффузии. Это повлияет на скорость затухания зеркальных и глосси переотражений, что добавит реализма.

   Итак, как же теперь настраивать сцену, исходя из вышеперечисленной информации. Я предлагаю свой способ, возможно, кто-то найдёт лучше. Найдите в своей сцене самый белый объект, прикиньте какое у него альбедо, а лучше найдите подобный материал в реальном мире, и сравните его с листом белой офисной бумаги, альбедо которого примерно 0,7. Далее, выставите это значение альбедо в материале, в Diffuse Level, для своего белого объекта, например, 0,5. Затем, чтобы упростить настройку и видеть все материалы в редакторе в привычной экспозиции, мы изменим интенсивность света в настройках материал эдитора до 2-х. Чтобы материал с нашим максимальным альбедо стал 100% белый. Для других значений альбедо работает простая формула: 1 / «альбедо» = «интенсивность света». Обратите внимание, что материал эдитор не сохраняет изменённое значение интенсивности света для конкретной сцены, а использует его для всех сцен. Далее выставляйте значение максимального альбедо (0,5) в Diffuse Level во всех материалах, которые вы будете редактировать. Затем, по мере визуализации изображения отрегулируйте её экспозицию.

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

   На этом у меня всё. Спасибо за внимание.

31 комментарий:

  1. Любопытный тутор, кое что новое для себя узнал. Спасибо!

    ОтветитьУдалить
  2. Очень интересно! надо опробовать...

    ОтветитьУдалить
  3. ну да последняя сцена более глубокая, приближается к фото реалу... Снкс за опыт

    ОтветитьУдалить
  4. Жирнейший урок!!!

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

    А тут, совершенно миниатюрная статейка, решает проблему в ее корне.

    Огромное спасибо!

    ОтветитьУдалить
  5. Игрался тут недавно с максвелл рендером. Там чисто белый материал имеет около 78% альбедо. Проверить легко, просто белый шар, на белом энвайрнменте. Разработчики сами решили его ограничить, чтоб народ не использовал слишком большие значения.

    ОтветитьУдалить
  6. ничего не понял)
    где это альбедо во врае))
    чего крутить и т.д..
    тока запутался.

    ОтветитьУдалить
  7. Vyacheslav Kulagin Поддержу вопрос. Чего крутить?)

    ОтветитьУдалить
  8. А что непонятного? Здесь подразумевается множитель Diffuse материала в качестве альбедо.

    ОтветитьУдалить
  9. Но вить в вирее одним Diffuse GI (отскок света) от материала не уменьшить. Будет только затемняться цвет. А на примерах видно, что цвет не затемняется а уменьшается отскок...

    ОтветитьУдалить
  10. В общем я хочу понять. Мне затемнять материал или регулировать отскок, или и то и другое?

    ОтветитьУдалить
    Ответы
    1. "Мне затемнять материал или регулировать отскок, или и то и другое?"
      _________________________
      Что-то одно. Лучше привыкать работать с цветом материала. Если используется текстура, то кладите её в ноду "output". Или на самой ноде текстуры крутите уровень, он в самом низу панели настроек текстуры расположен.

      Удалить
  11. Уважаемый Trofimm. Может в ментал Diffuse Level отвечает и за отскок и за яркость цвета? Т.к., еще раз повторюсь, у вас на примерах видно, что яркость цвета почти не меняется но сильно уменьшается отскок света. Или мне хочется именно такого цвета текстуру, не затемняя ее, но отражающая способность у нее не корректна, тогда получается крутить отскок? Спасибо.

    ОтветитьУдалить
  12. Вы скорее всего не внимательно читали. Я там пишу что уменьшаю яркость цвета материала и картинка естественно темнеет. И темнее она не просто уменьшается яркость, но и уменьшается отскок (проанализируйте пример с теннисными шариками). Потом я компенсирую потерю яркости в экспошур контроле, и потом ещё в фотошопе делаю небольшую коррекцию, чтобы картинки не отличались по яркости.
    В ментале диффуз левел это множитель для цвета. Просто удобнее его крутить, чем уровень яркости в текстурах. Но т.к. в врее нет диффуз левела, приходится крутить цвет и яркость текстур.

    ОтветитьУдалить
  13. Просто я тестил свою сцену, так же как и у вас с красным полом и белыми стенами. И, чтоб получить результат как у вас на Альбедо= 0,42 мне пришлось в оутпут сильно затемнить цвет, что не соответствует с вашим результатом. Поэтому я и подумал, может в ментале Diffuse Level работает по-другому. Но вот в VRayMtlWrapper когда уменьшаю gi (отскок) результат становится похож на ваш. Я немного запутался наверно, поясните пожалуйста этот момент. Спасибо)

    ОтветитьУдалить
  14. После того как написал, дошло до меня, что вы компенсируете яркость в экспошур))

    ОтветитьУдалить
  15. Хорошо. )
    В врее для цвета наверно удобнее использовать ноду VRayColor.
    Вот простенькая сцена: http://yadi.sk/d/a-Qz0Nz05DObf

    ОтветитьУдалить
  16. Трофим, спасибо за статью!
    Вопрос. Вы пишите: Далее выставляйте значение максимального альбедо (0,5) в Diffuse Level во всех материалах, которые вы будете редактировать.
    Почему предлагаете выставлять альбедо одинаковое для всех материалов? Ведь у каждого оно свое? Или имелось ввиду, что не больше 0,5, коли 0,5 у самого яркого материала?

    ОтветитьУдалить
  17. >> Или имелось ввиду, что не больше 0,5, коли 0,5 у самого яркого материала?

    Да. Значение 0,5, в этом примере, будет лимитом для всех материалов, основанное на самом ярком белом объекте. А потом уже крутить цвет и текстуры каждого материала по отдельности относительно полученного белого объекта. Естественно не меняя диффуз левел. Можно не пользоваться диффуз левел вообще, а просто ставить цвет белого на 0,5(к примеру), и все остальные материалы подгонять под него, но если потом понадобится изменить альбедо у всех, это будет сложнее.

    ОтветитьУдалить
  18. Трофим, то есть диффуз левел, то есть значение альбедо, у всех материалов в данной сцене одно - 0,5? Не могу понять почему? Разные материалы - разное альбедо. Просто не более 0,5 для данной сцены. Что я упускаю??

    ОтветитьУдалить
  19. Нет, альбедо у всех материалов будет разное, т.к. цвет это и есть альбедо. Цвет материалов же разный, кто-то светлее, кто-то темнее. А диффуз левел это просто множитель, как дополнительная ручка яркости цвета. Вы как бы регулируете яркость всех материалов через диффуз левел, выставляя в нём одинаковое значение для всех материалов. Т.е. если бы была ручка яркости для всех материалов, то удобнее было бы крутить её.

    ОтветитьУдалить
  20. Т.е. если бы была ОДНА ручка яркости для всех материалов, то удобнее было бы крутить её.

    ОтветитьУдалить
  21. Отличная статья, спасибо!)
    А если в Vray использовать значения Generate Gi (вкладка Vray object properties), то получим тот же результат? Или такой вариант не совсем верный?

    ОтветитьУдалить
  22. Ну это тоже самое что и глобальный множитель в настройках рендера, в меню ГИ, только для конкретного объекта. Корректно будет только через диффузию материала.

    ОтветитьУдалить
  23. Так и предполагал, спасибо! А вот по настройке -
    "мы изменим интенсивность света в настройках материал эдитора до 2-х"
    В опциях редактора материалов нашёл "Ambient Light", но он регулирует только общий цвет ячеек, на текстуры и диффуз не влияет. Пересмотрел все настройки в Compact и Slate вариантах Material Editor-а, так и не нашёл где меняется интенсивность. Подскажите пожалуйста)

    ОтветитьУдалить
  24. Над амбиентом, топ лайт, бэк лайт. Но они не работают с вреем, к сожалению. Можно попробовать загрузить свою сцену с источником и шариком, там ниже опция: Custom Sample Objects. Источник стандартный для начала попробовать, интенсивность 2 или сколько нужно поставить.

    ОтветитьУдалить
  25. Не за что ). Обращайтесь если что не понятно )

    ОтветитьУдалить