шие и наименьшие значения для каждой из компонент итт, vmin, ишах, vmax. После этого точке с исходными текстурными координатами (и, v) поставим в соответствиие следующие текстурные координаты: и' = """"" , у' = V~V|nin (10.3) и - и v - V .

шах mm max mm

Эти текстурные координаты мы и будем использовать в качестве текстурных координат для работы с картой освещенности.

Другой способ не требует существования каких-либо текстурных координат заранее - грань просто проектируется на одну из координатных плоскостей {Оху, Охг или Oyz) и координаты на плоскости подвергаются преобразованию (10.3) для получения текстурных координат. Для определения того, на какую из координатных плоскостей следует осуществлять проектирование, определяется компонента вектора нормали к грани с наибольшим по модулю значением. Она будет определять ось, вдоль которой будет осуществляться проектирование. Остальные две оси определяют плоскость.

По найденным значениям «niill, vinin, мтах, vmax можно найти размер карты освещенности. Обычно карта освещенности берется меньше исходной текстуры в несколько раз. Мы будем следовать игре Quake и возьмем размер карты освещенности в 16 раз меньше соответствующего текстурного диапазона (не размера текстуры, так как или текстура может повторяться, или может использоваться лишь ее часть). Тогда размеры карты освещенности будут определяться следующими формулами:

width = (int)ceil ( texMax.x / 16 ) -
- (int)floor ( texMin.x /16 ) + 1; height = (int)ceil ( texMax.y / 16 ) -
- (int(floor ( texMin.y / 16 ) + 1;

Исходя из вышеизложенного, можно построить класс для представления карт освещенности.

ом.

class Lightmap : public Object {
private:
Vector2D offs; Vector2D scale ;
Float matrix [4][4]; // OpenGL texture transform
// matrix
Texture * map; // the map itself

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

public :
Lightmap ( const char * theName, const vector2D& texMin,

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