const Vector2D& texMax, Texture * txt ); -Lightmap () ;
// remap normal texture // coordinates into normalized // lightmap coordinates Vector2D remap ( const Vector2D& uv ) const
return (uv - offs) * scale;
Texture * getTexture () const return map;
const float * getTextureMatrix () const return (const float *) matrix;
static MetaClass classlnstance;
} ;
Здесь
Метод remap служит для постановки в соответствие стандартным текстурным координатам координат, используемых для работы с картой освещенности.
Считая, что карты освещенности уже построены (способ их построения рассматривается ниже), рассмотрим сначала способ их наложения.
Вместо вывода карт сразу за выводом каждой грани мы будем строить список видимых граней внутри комнаты, требующих вывода карт освещенности, и в конце обработки всей комнаты будут выводиться карты освещенности. Соответствующий метод приводится ниже.
void SubScene :: drawLightmaps ( Views view, const
Arrays polyList ) const
{
glPushAttrib ( GL_COLOR_BUFFER_.BIT |
GL_TEXTURE_BIT | GL_DEPTH_BUFFER_BIT ); glDepthFunc ( GL_EQUAL ); glDepthMask ( GL_FALSE ) ; glEnable ( GL_BLEND );
glBlendFunc ( GL_ZERO, GL_SRC_COLOR ); glColor3f ( 1, 1, 1 ); //in case it has other
// value from prev calls
for ( Array :: Iterator it = polyList.getlterator (); !it.end (); ++it )
{
Polygon3D * poly = (Polygon3D *) it.value ();
Lightmap * lightmap = poly -> getLightmap () ,-
view.bindTexture ( lightmap -> getTexture () ); view.simpleDraw ( *poly, View :: useLightmap );
}
glPopAttrib ();
}
Поскольку карты освещенности выводятся на видимые грани, то в качестве теста глубины можно использовать равенство (GL_EQUAL), а запись в буфер глубины в этом случае просто не нужна. В качестве способа наложения текстуры обычно используется (GL_ZERO, GL_SRC_COLOR), т. е. способ наложения задается следующей формулой: С = Сіех'Сцф,пшр- (10.5)
Для того чтобы при задании каждой грани не надо было явно задавать имя файла с картой освещенности, удобно определить закон, ставящий в соответствие каждой грани по ее имени и имени соответствующей комнаты имя файла с картой освещенности. Поместим реализацию данного закона в класс World.