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

bool World : : buildSampleOnPoly ( const Polygon3D * poly,
const Vector2D& srcTex, const Vector2D& mid, Vector3D& sample ) const
float xStep = ( float )HALF_STEP/ (float)
poly->getTexture()->getWidth ();
float yStep = ( float )HALF_STEP/(float)
poly->getTexture()->getHeight();
Vector2D tex ( srcTex );
for ( int step = 0; step < NUDGE_STEPS; step++ ) {
sample = poly -> mapTextureToWorld ( tex ) ;
if ( poly -> contains ( sample ) ) return true;
// now try to "nudge" point towards polygon if ( step & 1 ) {
if ( tex.x > mid.x ) {
tex.x -= xStep;
if ( tex.x < mid.x ) tex.x = mid.x;
}
else
{
tex.x += xStep;
if ( tex.x > mid.x ) tex.x = mid.x;
}
}
else
{
if ( tex.y > mid.y ) {
tex.y -= yStep;
if ( tex.y < mid.y ) tex.y = mid.y;
}
el se
{
tex.y += yStep;

if ( tex.y > mid.у ) tex.y = mid.y;

}
}
}
return false;
}

Тогда метод для построения всех карт освещенности можно записать следующим образом: та

от.

bool World : : buildAHLightmaps () {
if ( IcreateDir ( lightmapDir ) ) return false;
for ( Array :: Iterator sclt = scenes.getlterator (); !sclt.end (); ++sclt )
{
SubScene * scene = (SubScene *) sclt.value ();
for ( Array :: Iterator it = scene -> getPolys ().getlterator (); !it.end (); ++it ) {
Polygon3D * poly = (Polygon3D *) it.value (),-
if ( !buildLightmapForPoly ( poly ) ) return false;
}
}
return true;

Чтобы не создавать отдельную утилиту для построения карт освещенности по сцене, можно просто добавить эту функциональность к основному модулю. Тогда параметр командной строки '-^гитаре' означает, что нужно только построить карты освещенности для сцены. Хотя данный подход для серьезных проектов вряд ли подходит, в данном случае он оказывается весьма удобным.

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

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


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