const Vector3D& normal ) const
{
Vector3D 1 = pos - point; float dist = 1.length ();
if ( dist >= radius )
return Vector3D ( 0, 0, 0 );
float cosAngle = (float) fabs ( (1 & normal) / dist );

Работа с картами освещенности

Vector3D cl ( color.x, color.y, color.z );
return cl * (brightness * cosAngle / (a + dist * (b +

+ с * dist)));

}
static MetaClass classlnstance;
} ;

Для задания источника света в хс-файле мы будем использовать следующие команды:

light yellow_light {
pos ( 0, 0.7, 2 )
color ( 1, 1, 0, 1 )
radius 10 brightness 4 constant 0.5
linear 4 square 0
}

Параметры constant, linear и square задают коэффициенты уравнения (10.1).

Рассмотрим теперь подробнее использование карт освещенности. Для каждой грани исходной сцены необходимо построить ее карту освещенности - текстуру, содержащую значения освещенности грани в некотором наборе точек. Так как карта освещенности является текстурой (мы будем далее считать ее 24-битовой RGB-текстурой), то возникает вопрос о текстурных координатах для вершин данной грани.

Однако в общем случае обычные текстурные координаты (применяемые при выводе основной текстуры) не подходят для использования при выводе карты освещенности. Рассмотрим, например, достаточно большую грань, когда основная текстура накладывается с повторением (т. е. текстурные координаты выходят за пределы единичного квадрата). Если непосредственно использовать эти же текстурные координаты для вывода карты освещенно-', сти, то она также будет выведена с повторением, т. е. возникает ситуация, ' когда разным точкам грани соответствует одна и та же точка на карте осве-1 щенности, чего не должно быть.

Существуют различные способы построения текстурных координат для использования при выводе карты освещенности. Мы будем использовать , способ, основанный на преобразовании не приведенных к отрезку [0, 1 ] текстурных координат. Для текстурных координат (и, v) находятся наиболь-(

\ 279

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