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» («если достаточно прозрачен»), например:


⇐ Предыдущая| |Следующая ⇒