Рассмотрим генерацию четких или "жестких" теней от точечных источников освещения. Пусть у нас имеется луч (ray), позиция удара о поверхность (hit_pos) и позиция источника освещения (light_pos). Мы хотим выяснить, находится точна hit_pos в тени или нет. Можно траверсить луч от источника освещения к точки удара или наоборот, на корректность результата это не повлияет. Будем испускать лучи из источника освещения в точку удара о поверхность. Если мы найдем любое пересечение, координата t (параметрическое уравнение прямой) которого лежит в пределах от нуля до координаты t точки hit_pos, то точка hit_pos находится в тени.
RAY ray;
ray.pos = light_pos;
ray.dir = hit_pos - light_pos;
t_max = ray.dir.len() - 1e-4f;
ray.dir /= t_max;
T t_hit = TraversaRay(...);
if (t_hit > 0 && t_hit < t_max)
{
// точка в тени
}
Вот как выглядят резкие тени:
То же самое с антиалиасингом (4 луча на пиксел). Источник света немного в другой позиции.
|