Еще надо отметить, что обычно объекты непрозрачны и поэтому преломлением пренебрегают.
Алгоритм работы функции трассировки луча с началом o = (ox,oy,oz) и направлением d = (dx,dy,dz), возвращающей, кстати, освещенность по всем трем цветовым компонентам, будет, таким образом, выглядеть примерно так:
ищем ближайшее пересечение луча со сценой (определяем точку p, где произошло пересечение, выясняем, с каким конкретно объектом оно произошло)
если не нашли, возвращаем 0
если пересечение есть, текущую освещенность полагаем равной фоновой освещенности (ambient)
определяем вектор n, нормаль к объекту в точке пересечения
для кажого (точечного) источника света
считаем вектор l, соединяющий источник и точку p (начало в p)
ищем пересечение луча с началом в точке p и направлением d со сценой
если нашли, прекращаем обработку этого источника, так как его не видно
считаем симметричный l относительно n вектор r
считаем по уравнению Фонга (оно использует n, l, r, d) освещенность в точке за счет этого источника света, добавляем ее к текущей
считаем симметричный d относительно n вектор refl, то есть отраженный вектор
трассируем отраженный луч (с началом p и направлением refl), добавляем полученную освещенность к текущей
считаем направление преломленного луча (вектор refr) по d, n и коэффициентам преломления
трассируем преломленный луч (с началом p и направлением refr), добавляем полученную освещенность к текущей
покомпонентно умножаем текущую освещенность на цвет объекта
если для материала, заполняющего пройденную лучом от o до p трассу beta != 0, умножаем текущую освещенность на коэффициент ослабления
возвращаем текущую освещенность
При стандартной камере, которая находится в (0,0,-dist), и ориентирована так, что пикселу экрана (sx,sy) соотвествует 3D-точка (sx-xSize/2, ySize/2-sy, 0), для получения цвета пиксела (sx,sy), очевидно, достаточно оттрассировать луч, положив при этом
ox = oy = dz = 0,
oz = -dist,
dx = sx - xSize / 2,
dy = ySize / 2 - sy.