Ismét egy kis játékanatómia ezúttal Quake2 engine.
Amire kiváncsi voltam, hogy a dinamikus modellek árnyalását hogyan oldották meg. Jelen esetben azonban egy igen leegyszerűsített árnyalásról van szó, amivel nem is nagyon érdemes foglalkozni. Sokkal inkább azzal, hogy a modellre ható fény színét hogyan határozza meg az engine.
Kicsit elmélyülve a forráskódban a következőt találjuk:
void R_DrawAliasModel (entity_t *e)
{
...
R_LightPoint
GL_DrawAliasFrameLerp
...
}
ebből ami nekünk kell az az R_LightPoint
void R_LightPoint (vec3_t p, vec3_t color)
{
...
RecursiveLightPoint
...
}
aminek az egyik lényegi része a RecursiveLightPoint függvény, amely a statikus fényt számítja ki / határozzza meg az adott ponthoz.
Ami pedig úgy történik, hogy
- bejárja hozzá a BSP fát
- megkeresi, hogy a pont melyik surface felett van
- meghatározza az így kapott ponthoz tartozó lightmap textúra koordinátákat
- kiolvassa a lightmapból a színt és ezt adja vissza végeredményül
A dinamikus fényekkel úgy tűnik sokkal kíméletlenebb: lineáris kereséssel ellenőrzi a fényforrásokat, hogy elég közel vannak-e és ha igen, akkor hozzáadja a végeredmény színhez a fényforrás modulált színét.
Kissé brute force-nak tűnik, de mint tudjuk ez már működött 200 MHz magasságában is...