Eddig még nem nagyon jutott időm és lehetőségem effektek készítésére, de most végre sikerült megvalósítanom a lens flare-t avagy a lencsecsillanást.
A jelenség fizikai okai a képrögzítéshez használt lencse fénytörésére vezethető vissza, amely nehezen (vagy nem) szimulálható képszintéziskor azonban a látvány egyszerűen utánozható.
Ehhez mindössze egy adatra van szükségünk: a fényforrás 3D pozíciójára.
Lépések:
- Átvisszük a fényforrást a clip space-be (itt a tartomány -w...+w). Ez a művelet egy olyan gluProject, amelyből kihagyjuk a viewport és depth range transzformációt. Ez a művelet mindössze a modelview-projection mátrix és a pozíció beszorzását igényli.
- Elvégezzük a (homogén) vágást a közeli (-z) oldalra (azért kell a közeli oldalra ez a fajta vágás, hogy elkerüljük a homogén átfordulást) aztán a homogén osztást. Így átkerül NDC-be (ahol a tartomány -1...+1) a fényforrás és itt is elvégezzük a vágást. Ezekkel a lépésekkel gyakorlatilag egy frustum vágást valósítottunk meg.
- A következő lépés opcionális. Ugyanis még egy láthatósági vizsgálatot (occlusion cull) is eszközölhetünk, amelyre többféle módszer létezik. Szinte kínálja magát az occlusion query, de helyette használjunk egy másik módszert.
3. a. Végezzük el a viewport és a depth range transzformációt.
3. b. glReadPixels-szel olvassuk ki a megfelelő mélység értéket.
3. c. Hasonlítsuk össze az általunk használt értékkel. Amennyiben a kiolvasott érték kisebb, mint a miénk akkor takarásban van a fényforrás. - Tehát most már tudjuk, hogy a fényforrás látszik-e vagy sem és azt is tudjuk, hogy az NDC-ben hol helyezkedik el.
- Következő lépésben kiszámoljuk a kiegészítő elemek helyzetét. Ilyenkor már 2D-ben számolunk vagyis csak az x és y komponensekre van szükségünk. Szerencsére az NDC origójának x,y síkra vett vetülete a képernyő középpontjával megegyezik így nincs szükségünk eme pont kiszámítására és így a fényforrás levetített pozícióját tekinthetjük egyben egy irányvektornak (FFIV) is. A lens flare járulékos elemei a FFIV mentén fognak elhelyezkedni. Számoljuk ki FFIV hosszát (L) és normalizáljuk (NFFIV). A kiegészítő elemek a NFFIV * L * factor helyre fognak kerülni, ahol a factor egy általunk megadott érték, amely lehet negatív is.
- Szerencsére az NDC-ben történő renderelés is egyszerű:
- a vetítési és modellnézeti mátrixot egységmátrixra kell állítani
- az előzőleg kiszámolt pozíciók mind NDC-ben vannak.
Természetesen annyi járulékos elemet jeleníthetünk amennyit szeretnénk, de általában 4-6 darab elég szokott lenni.
A factor tetszőlegesen variálható elemenként hasonlóan az elemek méretéhez.
Figyeljünk arra, hogy a lens flaret ne additív blendeléssel, hanem alfa blendeléssel rajzoljuk ki és ezt a textúrák készítésekor is vegyük figyelembe!