{
compute the ray's direction II вычисляем направление луча
theRay.setDi r(<di rection>): // set the ray's direction // устанавливаем направление луча
clr.ser(scn.shade(theRay)): // find the color // находим цвет
glColor3f(clr.red. clr.green. clr.blue):
gl Recti(col.row. col + blockSize. row + blockSize):
}
}
14.5. Организация трассировщика луча в приложении В листинге 14.3 приведен скелет метода raytraGeO. В нем начальная точка луча theRay устанавливается один раз для глаза, а затем для каждого пиксела вычисляется и устанавливается направление гс-луча в соответствии с уравнением (14.3). Затем объекту sen класса Scene предписывается определить цвет, возвращающийся по данному лучу:
clr - scn.shade(theRay).
В методе shadeO выполняется сложная работа: он «испускает» («casts») луч на сцену, определяет пересечения, вычисляет цвет света, идущего обратно по лучу, и возвращает значение этого цвета. Мы разработаем этот метод в конце главы.
Рисование «пиксельных блоков» Параметр blockSize определяет размер блока из пикселов, которые рисуются на каждом шаге. Отображение пиксельных блоков просто экономит время программы-просмотрщика (viewer) во время работы трассировщика луча: сформированные изображения являются черновыми, однако появляются быстро; вместо трассировки луча через каждый пиксел, при котором изображение появляется медленно, пиксел за пикселом, трассировка осуществляется только для нижнего левого угла каждого пиксельного блока.
На рис. 14.8, а показано, как работает данная процедура для простого дисплея с 16 строками и 32 столбцами истинных пикселов, когда blockSize задан равным 4. Каждый блок состоит из 16 пикселов. Определяется цвет луча, проходящего через угол блока, и этот цвет присваивается всему блоку (всем его 16 пикселам). Изображение будет выглядеть как растровое 4 на 8 блоков, что дает только очень грубое приближение к трассировке с полным разрешением. Зато такое изображение может рисоваться очень быстро. Если это грубое изображение показывает, что все делается правильно, то программа просмотра может сделать повторную трассировку сцены с полным разрешением, задав blockSize равным 1. На рис. 14.8, б показана простая сцена, для которой трассировка луча производилась с размерами блоков 4, 2 и 1. Визуализация первого варианта происходит в 16 быстрее, чем последнего.