Цвет, видимый в точке соударения, зависит от сочетания фоновой, диффузной и зеркальной составляющих света. Коэффициенты отражения par, pdg и остальные хранятся вместе с объектом соударения и доступ к ним возможен через поля mtrl .ambient, mtrl .diffuse, mtrl .specular. Загрузка в эти поля происходит при первом чтении SDL-файла На практике зеркальный цвет по Фонгу обычно принимают равным цвету источника света. Для этого коэффициенту отражения присваивают одинаковые красный, зеленый и синий компоненты: (0,9,0,9, 0,9), поэтому при умножении на этот коэффициент цвет источника света дает тот же цвет, хотя и слегка ослабленный. В результате этого эффекта материал выглядит как блестящая пластмасса.
Если коэффициент mtrl. specul аг выбирать более тщательно, то можно несколько увеличить реалистичность бликов Фонга. Коэффициенты, приведенные в табл. 8.1 согласно работе Мак-Рейнольдса и Блайта (McReynolds, Blythe), обеспечивают более реалистичный вид различных материалов.
Коэффициенты отражения легко могут быть добавлены в SDL-файл сцены. Различные материалы вначале определяются посредством следующего кода:
def Copper{ ambient 0.19125 0.0735 0.0225
diffuse 0.7038 0.27048 0.0828
specular 0.256777 0.137622 0.086014 exponent 12.8}
def Gold{ ambient 0.24725 0.1995 0.0745
diffuse 0.75164 0.60648 0.22648
specular 0.628281 0.555802 0.366065 exponent 51.2}
и затем используются для задания свойств различных объектов сцены, что делается примерно так:
use Gold
sphere ! make the sphere out of gold
! создаем сферу из золота translate 12 1
use Copper cube ! and the cube out of copper
! и куб из меди Листинг 14.10. Добавление вычислений закрашивания в подпрограмму shadeO (псевдокод)1
СоТогЗ Scene :: shade(Ray& г) {
Get the first hit using getFirstHit(r, best): // Получаем первое соударение с помощью Make handy сору h - best.hit[0]:
14.7. Рисование закрашенных изображений сцен
// создаем удобную копию // data about the first hit // данные по первому соударению
Form hitPoint based on h.hitTime // Формируем hitPoint на базе h.hitTime