Cvičení
Veškeré podvádění, zejména opisování a vydávání cizí práce z vlastní, bude přísně potrestáno. Viz
Akademická pravidla.
Zdrojové kódy jsou archivovány a podrobeny testům odhalujícím plagiáty.
Není přípustné, abyste nerozuměli předváděnému kódu a vymlouvali se na to, že ho programoval kolega z týmu - toto bude interpretováno jako vydávání cizí práce za vlastní.
Musíte být schopni na cvičení provést drobné úpravy v kódu podle požadavku cvičícího.
Osnova
Organizace cvičení a bodování
Na cvičení jsou studenti rozděleni do dvoučlenných týmů.
Všechny týmy řeší 5 shodných úloh. Za každou úlohu lze získat 10 bodů + případné bonusy.
Podmínkou zápočtu je získání minimálně 30 bodů za řešené úlohy + test.
Hodnocení v rámci týmu je společné.
Za nedodržení termínu odevzdání úlohy je penále 3 body za každý týden zpoždění.
Pozor! Záporné body nabíhají rychleji, než byste čekali - bodování je přísné.
Nikdy nespoléhejte na to, že úlohu vyřešíte v noci před odevzdáním.
Implementace realizujte v programovacím jazyce C/C++ buď na platformě Windows nebo Linux (potřebný projektový soubor nebo makefile je součástí balíčku testovací aplikace).
Kód musí být okomentovaný, přehledný, nestandardní situace musí být ošetřeny výpisem chybového hlášení.
SOUTĚŽ o nejrychlejší kód
Jednoduchá grafická knihovna
Jednoduchý ray tracer
Budete implementovat jednoduchý ray tracer v jazyce C++.
Ray tracer bude podporovat různá grafická primitiva (alespoň koule a trojúhelník) a základní osvětlovací model (alespoň Phong).
Cílem je, aby si každý samostatně vyzkoušel navrhnout architekturu ray traceru - snažte se o čistotu návrhu a kódu. Využijte přednosti objektového programování (polymorfismus, dědičnost, zapouzdření). Např. všechna grafická primitiva jsou odvozena ze stejné třídy, ale implementují jinak metodu pro nalezení průsečíku. Totéž pro osvětlovací modely.
Ke stažení
Svoji vlastní implementaci pište do souboru sgl.cpp.
Header sgl.h neměňte, je to pevně dané rozhraní mezi SGL a testovací aplikací.
V případě potřeby můžete použít i jiný hlavičkový nebo zdrojový soubor (např. context.h/context.cpp). ale nepřidávejte žádné .cpp!
Testovací aplikace pro všechny úlohy pro Windows a Linux (GLUT):
testapp.zip
kontexty s jednotlivými testy se přepínají klávesami 0 - 9
kontexty 0-2 jsou pro úlohu 1, ostatní pro úlohy 2 a 3
Odkazy
Zadání úloh
Úloha 1
Knihovna pro 2D grafiku, část A
Referenční obrázky
grafické elementy
transformace
zásobník transformačních matic
Úloha 2
Knihovna pro 2D grafiku, část B
Zadání
Vyplňování nekonvexního polygonu
Vyplňování kružnice, elipsy a oblouku.
Projekční trasformace (sglFrustum()).
Řešení viditelnosti pomocí z-bufferu.
Vykreslení 3D objektů načtených z
NFF souboru.
BONUS:
Referenční obrázky
vyplňování nekonvexního polygonu
vyplňování grafických elementů
rendering 3D scény - krychle se z-bufferem/bez něj
rendering 3D scény - data z NFF
Úloha 3
Jednoduchý ray tracer, část A
Zadání
Načtení scény ve formátu
NFF ze souboru zařídí testovací aplikace.
Scéna je knihovně sgl předána pomocí volání funkcí (viz sgl.h).
Nastavení kamery provede testovací aplikace jako u rasterizace.
Generování primárních paprsků:
Vyhodnocení Phongova osvětlovacího modelu:
Je li z NFF načteno: f R G B Kd Ks S T IR,
pak rgb složky koeficientu difúzního odrazu pro Phongův model jsou [R*Kd G*Kd B*Kd]
a rgb složky koeficientu zrcadlového odrazu pro Phongův model jsou [Ks Ks Ks].
(Jinými slovy: odlesky mají vždy bílou barvu, nezávisle na difúzní barvě objektu.)
Při odevzdávání úloh chci vidět architekturu vašeho ray traceru načrtnutou na papíře (třídy, metody, dědičnost, co se odkud volá).
BONUS:
Testovací scény a referenční obrázky
Úloha 4
Jednoduchý ray tracer, část B
Testovací scény a referenční obrázky
vržené stíny (cornell-blocks.nff)
ideální zrcadlový odraz a lom (cornell-spheres.nff)
mnohonásobný ideální zrcadlový odraz a lom (cornell-spheres-crazy.nff)
(Abyste dostali výsledky stejné jako v náhledu, je třeba brát v úvahu pouze průsečíky s přední stranou polygonu - pokud paprsek protne polygon ze strany odvrácené od normály, průsečík se neuvažuje. Max. hloubka rekurze 8.)
Úloha 5
Jednoduchý ray tracer, část C
Zadání
Plošné zdroje světla
Plošné zdroje světla definovány pomocí emisivního materiálu - viz sglEmissiveMaterial
Geometrie plošných zdrojů - trojúhelníky
Výpočet řešit vzorkováním plošného zdroje
Intensita světelného vzorku (použitá ve Phongově osvětlovacím modelu):
cos fi = DotProd(light_triangle_normal, -shadow_ray.direction)
Testovací scény a referenční obrázky