Ray Tracing: Antialiasing

Antialiasing je v podstate nosnou časťou ray tracingových programov. Vektorový formát obrazu poskytuje bezhraničné výstupy, teda výstupy obrazových formátov, ktoré neobsahujú „štvorčekový“ tvar obrazu. Konkrétne sa jedná o nasledujúci typ obrazu: (obrázok od Kevin Suffern)

obraa

Na okrajoch objektu je možné vidieť nerovnomerné okraje (ako tzv. aliasy) pri niekoľko násobnom zväčšení. Tento jav je sprievodným javom pri tzv. rastrovom zobrazovaní, oproti tzv. vektorovému zobrazovaniu. Každý rastrový obrázok podlieha takýmto obrazovým odchýlkam. Práve z toho dôvodu, okrem iného, vznikajú rôzne algoritmy, ktoré sa tento jav snažia nejakým spôsobom potlačiť a práve tento jav nazývame antialiasing.

Nerovnomerné okraje predstavujú určité zástupné pixely, ktoré sledujú pôvodnú líniu objektu. Ako je možné vidieť na obrázku, trojuhoľník, ktorého prepona predstavuje nerovnomerné kraje definujeme na jednej strane dokonale hladkou líniou a na druhej strane je táto nedokonalá línia nahradená, zastúpená, určitými pixelmi, ktoré približne mapujú túto líniu. (obrázok od Kevin Suffern)

bbobr

Cieľom je priblížiť sa čo najbližšie k dokonalej línii. Za týmto účelom potrebujeme daný pixel nejakým spôsobom rozdeliť takým spôsobom, aby lepšie mapoval pôvodnú dokonalú líniu. Úlohou ray tracingu je z tohto pohľadu vygenerovať väčší počet lúčov v rámci jedného pixelu. (obrázok od Peter Shirley)

antialiass

Pre daný pixel máme niekoľko vzoriek v tomto pixeli a vygenerujeme lúče cez tieto vzorky. Výsledná farba pixelu bude výsledkom priemernej hodnoty farieb týchto vygenerovaných lúčov.

Spôsob, akým budeme generovať dané lúče v určitých miestach pixelu bude závisieť od generátora náhodných čísel, ktorý môže vyzerať nasledovne:

Je možné použiť akýkoľvek iný generátor náhodných čísel pre reálne čísla v rozmedzí od 01.

Keďže budeme v budúcnosti potrebovať vytvoriť poziciovateľnú kameru, pohľad, tak si pôvodné zobrazenie prostredníctvom lúča ako „eye camera“ prepíšeme do samostatnej triedy:

Samotný cyklus pre vykresľovanie, ktorý pôvodne obsahoval dva cykly (pre súradnicu v smere x a y) bude okrem toho obsahovať aj ďalší cyklus pre antialiasing:

Teda, v každom bode prechodu obrazovkou vygenerujeme v cykle 0n počet lúčov s náhodným umiestnením. Samozrejme, čím vyšší počet týchto lúčov bude, tým dosiahneme jemnejšie zobrazenie nerovnomerných okrajov objektu.

Pre antialiasing s počtom prechodov ns = 1 bude vyzerať výstup nasledovne:

ns1

Pre antialiasing s počtom prechodov ns = 10 bude vyzerať výstup nasledovne:

ns10

Takýmto spôsobom je možné redukovať nerovnomerné okraje objektov. Ako je možné vidieť, v zásade sa jedná len o viac-násobné generovanie lúčov v rámci každého zobrazovaného pixelu na obrazovke. Problematika antialiasingu ako takého je, ako už bolo na začiatku spomenuté, nosnou časťou ray tracingu je pomerne zložitou časťou štatistickej matematiky. Jednotlivé ray tracingové programy používajú do veľkej miery práve rôzne vzorkovacie metódy na dosiahnutie najlepších výsledkov. Takže z toho hľadiska by bolo možné povedať, že kvalita ray tracingových programov závisí od efektívnosti použitia rôznych vzorkovacích algoritmov štatistického druhu.

You may also like...