Таблица 12.1
№ |
Номер текстуры |
Сдвиг |
Масштаб |
0.5 | 0.5 | ||
0.33 | 0.25 | ||
0.1225 | |||
-0.5 | 0.5 | ||
-0.25 | 0.25 | ||
-0.18 | 0.25 |
Добавляем эффекты
Обратите внимание, что и гало и блики на линзах должны выводиться после отрисовки всей сцены. Если их рисовать сразу при выводе очередной комнаты, то они могут закрываться гранями и объектами, что будет неправильно. Поэтому оба этих эффекта должны обрабатываться уже на этапе постобработки. Для их поддержки мы введем в метод render список, в который каждая комната может добавить видимые источники постэффектов. После отрисовки всей сцены метод render класса World выводит постэффекты.
Ниже приводится метод processLights класса SubScene, служащий для добавления видимых источников света в список постэффектов.
S
void SubScene :: processLights ( const Cameras camera,
const FrustrumS viewFrustrum, Arrays post ) const
{
World * world = (World *) getOwner ();
for ( Array :: Iterator it = objects.getlterator () ; !it.end (); ++it )
{
Light * light = dynamic_cast <Light *> ( it.value () );
if ( light == NULL ) continue;
// it's a light source check for effective // distance of light source if ( camera.getPos ().distanceTo
( light -> getPos () ) >= light -> getRadius () ) continue,-
// now check whether it lies within // view frustrum if ( !viewFrustrum.contains ( light -> getPos () ) ) continue;
// trace ray to light to see if // it's visible if ( world -> pointVisibleFrom ( light -> getPos(), camera.getPos() ) )
post.insert ( light );
}
}
Для вывода этих эффектов используется следующий метод: А. В. Боресков. Графики трехмерной компьютерной игры
9
us.
struct FlareDesc {
int index; // texture index
float lengthScale; float imageScale;
} ;
static FlareDesc flareTable [7] = {
{ 0, 1, 1 }, // primary flare
{ 1, 0.5f, 0.5f }, // first halo
{ 2, 0.33f, 0.25f }, // small birst
{ 3, 0.125f, 1 }, // next halo
{ 2, -0.5f, 0.5f, }, // next birst
{ 3, -0.25f, 0.25f }, // next halo