Полупрозрачни среди
Чрез рейтрейсинг лесно могат да се симулират ефектите, получени при преминаването на светлината през полупрозрачни среди (например, течности като чай, вино, бира и т.н., както и твърди материали като аметист, сапфир и подобни). Физическата формулировка на този феномен е конкретизирана доста отдавна и е известна под името закон на Бер-Ламберт. Законът най-общо казва, че, когато минаваме през полупрозрачна среда, процентът на пропусканата светлина намалява експоненциално с изминатото разстояние.
В задачата се изисква да реализирате въпросния ефект, като добавите свойства insideColor (цвят) и absorption (число) на шейдъра Refraction. В шейдъра трябва да вкарате код, който засича кога лъчите пътуват "вътре" в материала, и, когато absorption > 0, да променят връщания цвят по подходящ начин. Трябва да се пресметне "преминаващата" светлина по експоненциалния закон, описан в статията в wikipedia, като "погълнатата" светлина се замени с insideColor - т.е., колкото повече път през полупрозрачната среда минава лъча, толкова повече трябва връщаният цвят да клони към insideColor.
Задачата носи 10т.
Пример:
Сцената beer.hexray (добавена в хеш 49f9dd) демонстрира един полупрозрачен чайник, и една винена чаша, в която има полупрозрачна течност. Респективните Reflection шейдъри си имат свойствата absorption и insideColor. Тъй absorption зависи от базата на експоненциалното затихване, което ще използвате, за примерната картинка по-долу е ползвана втората формулировка на закона в статията в wikipedia ("за газове", с основа Неперовото число):
Т.е. след като реализирате Beer-Lambert ефекта, трябва да получите нещо подобно на горната картинка.
Comments
beer.trinity
Извинявайте, въпросът може да е нещо, което трябва да знаем по принцип, но искам да попитам: Всички ли промени по кода да са в beer.trinity? Защото не откривам на друго място да има shader Refraction. По - натам може да имам по-сложни въпроси, но за сега е това.
Не.
Не, разбира се - промените са в shader.cpp, сцената няма какво да я пипате.