о)
String World :: getLightmapNameForPoly ( const
Polygon3D * poly ) const
{
String sceneName;
Работа с картами освещенности
if ( poly -> getOwner () != NULL )
sceneName = poly -> getOwner () -> getName () ,-
return lightmapDir + "/" + sceneName + "_" + + poly -> getName () + ".tga";
}
Как видно из приведенного кода, мы считаем, что все карты освещенности располагаются в специальном каталоге, например 'lighmaps'. Тогда на этапе загрузки сцены достаточно проверить для каждой грани, существует ли файл с соответствующей картой освещенности по имени, и при необходимости загрузить его и связать с данной гранью.
Рассмотрим теперь сам процесс построения карт освещенности.
Первым шагом является определение закона освещенности точки. Мы будем использовать следующий закон:
1(р)=и + ^,МрН(Рг оо.б)
Как видно из формулы (10.6), за освещенность точки р мы будем принимать сумму освещенности точки от каждого источника света с учетом затененности источника (величина $,.(/>) = 1 тогда и только тогда, когда данный источник свет виден из точки р, в противном случае эта величина равна нулю) и "фоновой" освещенности 1атЬ. Фоновая освещенность гарантирует, что даже в отсутствие близко расположенных источников света освещенность не будет меньше заданной.
Сам алгоритм построения карт освещенности достаточно прост - сначала по формуле (10.4) определяются размеры карты, после чего вводится сетка точек на карте, являющаяся разбиением единичного квадрата текстурных координат в соответствии с размерами карты освещенности. Далее для каждой точки сетки определяется точка на грани, соответствующая данным текстурным координатам, и из нее трассируются лучи ко всем источникам света. Если источник света виден, то при помощи функции getLighhtAt определяется его вклад в освещенность данной точки.
После того как полная освещенность точки (с учетом фоновой) будет найдена, она обрезается по отрезку [0,1] и записывается в текстуру. После обработки всех точек соответствующая текстура записывается в файл.