if(r.recurseLevel - maxRecursionLevel) return color: // don't recurse further // дальше рекурсию не производим
if(hit object is shiny enough) II обьект соударения достаточно блестящ // add any reflected light // добавляем любой отраженный свет
{
get reflection direction II определяем направление отражения
build reflected ray. refl II строим отраженный луч refl
refl.recurseLevel - r.recurseLevel + 1:
color.add(shininess * shade(refl)):
}
if(hit object is transparent enough) II если обьект соударения достаточно прозрачен {
get transmited direction II определяем направление преломленного света
build transmitted ray. trans II строим преломленный луч trans
trans.recurseLevel - r.recurseLevel + 1:
color.add(transparency * shade(trans));
}
return color:
}
14.11. Отражения и прозрачность
Для включения этих визуальных эффектов произведено усовершенствование метода Scene :: shadeO, допускающее его рекурсивный самовызов. В листинге 14.15 приведен скелет метода shadeO; следует обратить внимание, что он добавляется к версии этого же метода shadeO из листинга 14.4. При корректных условиях метод shade О вызывает себя дважды: для учета компонентов отраженного и преломленного света. Если объект соударения «достаточно блестящ», чтобы оправдать затрату усилий на «углубленную» трассировку лучей, то испускается отраженный луч и метод shade() определяет, сколько света возвращается обратно в направлении отражения. Количество света, найденное методом shadeO, умножается на коэффициент отражения reflectivity объекта соударения. Этот коэффициент отражения хранится в одном из полей самого объекта. Пользователь задает этот коэффициент в SDL-файле, например, так: reflectivity 0.8 (см. приложение Д). Э же коэффициент используется для тестирования «if shiny enough» («если достаточно блестящ»), например:
if(reflectivity > 0.6)…
Если объект соударения «достаточно прозрачен», чтобы оправдать дальнейшую трассировку лучей, то испускается преломленный луч, после чего метод shadeO вычисляет, сколько света возвращается назад в направлении преломления. Найденное количество света умножается на коэффициент преломления transparency объекта соударения. Этот коэаэфициент также хранится вместе с объектом, и он же используется для тестирования объекта соударения «if transparent enough» («если достаточно прозрачен»), например: