Cvičení

Obecné informace

  • Úlohy se odevzdávají na serveru https://cw.felk.cvut.cz/upload/. Aktuální úloha musí být nahrána rovněž na server http://apg.courses.dcgi.fel.cvut.cz/. Týmy jsou pro úlohy již definovány. Odevzdávají se pouze zdrojové kódy.
  • 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

Datum Cvičení
1. 3.10. Seznámení s obsahem cvičení
Organizační záležitosti
2. 10.10. Rozdělení do týmů
Zadání úlohy 1
3. 17.10. Práce na úloze 1
4. 24.10. Odevzdání úl. 1
Zadání úlohy 2
5. 31.10. Práce na úloze 2
Rychlokurs správy paměti
6. 7.11. Odevzdání úl. 2
Zadání úlohy 3
7. 14.11. Práce na úloze 3
8. 21.11. Odevzdání úl. 3
Zadání úlohy 4
9. 28.11. Práce na úloze 4
10. 5.12. Odevzdání úl. 4
Zadání úlohy 5
11. 12.12. Písemný test
Práce na úloze 5
12. 19.12. (rozvrh pátek – lichý týden)
Odevzdání úl. 5
13. 2.1. Zápočet
14. 9.1. Rezerva

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é.
  • Jednotlivé úlohy budou odevdávány přes webovou aplikaci na adrese: http://apg.courses.dcgi.fel.cvut.cz/
  • 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
    • vyhodnocení pro úlohy 1 až 3
    • testovací úlohu dodá cvičící
    • 1. místo … bonus 3 body
    • 2. místo … bonus 2 body
    • 3. místo … bonus 1 bod

Jednoduchá grafická knihovna

  • Budete implementovat jednoduchou grafickou knihovnu podobnou OpenGL pro vykreslování 2D a 3D objektů nazvanou SGL (Simple Graphics Library).
  • Cílem je, abyste si osvojili základní grafické algoritmy a principy rasterizačního řetězce. Knihovna je obdobou OpenGL driveru - máme definované API, budeme postupně doplňovat jeho funkčnost a testovat ho pomocí testovací aplikace.

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í

  • Rozhraní knihovny a základní implementace: sgl.h, sgl.cpp
  • 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!
  • Dokumentace SGL API (vygenerováno automaticky ze souboru sgl.h)
  • Testovací aplikace pro všechny úlohy pro Windows a Linux (GLUT): testapp.zip
    • Poslední verze souboru testapp.cpp
    • 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
    • dokumentace k testovací aplikaci
    • testapp.exe pro Windows, neoptimalizovaná verze

Odkazy

Zadání úloh

Úloha 1

Knihovna pro 2D grafiku, část A

Zadání

  • Inicializace knihovny, návrh potřebných datových struktur
  • Vykreslení základních grafických elementů
    • Bod
    • Čára a lomená čára (Bresenhamův alg.)
    • Kružnice (Bresenhamův alg.)
    • Elipsa (sglEllipse()) a kruhový oblouk (sglArc())
      • aproximace elipsy pomocí 40 úseček
      • aproximace oblouku pomocí 40*(from-to)/(2 PI) úseček
      • BONUS:
        • adaptivní aproximace elipsy a oblouku s max. odchylkou 1 pixel (1 bod)
    • Transformace
      • Modelovací transformace (posunutí, otočení a změna měřítka)
      • Ortografická transformace (sglOrtho)
      • Transformace okno-výřez (viewport transformace)
      • Zásobník transformací

Referenční obrázky

grafické elementy
grafické elementy

transformace
transformace

zásobník transformačních matic
zásobník transformačních matic

Úloha 2

Knihovna pro 2D grafiku, část B

Zadání

  • Vyplňování nekonvexního polygonu
    • pár funkcí sglBegin(SGL_POLYGON) - sglEnd()
    • algoritmus musí zvládnout vyplnit sebeprotínající polygon
      • proto nelze použít semínkové vyplňování
  • 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.
    • O načtení dat ze souboru se postará dodaná testovací aplikace.
  • BONUS:

Referenční obrázky

vyplňování nekonvexního polygonu
vyplňování nekonvexního polygonu

vyplňování grafických elementů
vyplňování grafických elementů

rendering 3D scény - krychle se z-bufferem/bez něj
rendering 3D scény - krychle se z-bufferem/bez něj

rendering 3D scény - data z NFF
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ů:
  • Průsečík paprsku s koulí (jeden z algoritmů, zdroj http://www.devmaster.net/wiki/Ray-sphere_intersection)
  • Průsečík paprsku s trojúhelníkem (vyberte si z algoritmů Moeller, PBRT - viz www.pbrt.org)
  • 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:
    • adaptivní anti-aliasing (1 bod),
    • podpora více osvětlovacích modelů, např. Cook-Torrance nebo Ward (1 bod)

Testovací scény a referenční obrázky

koule (sphere.nff)
koule

Cornell box (cornell.nff)
Cornell box

koule na podlaze (floor_sph.nff)
koule na podlaze

Úloha 4

Jednoduchý ray tracer, část B

Zadání

Testovací scény a referenční obrázky

vržené stíny (cornell-blocks.nff)
vržené stíny

ideální zrcadlový odraz a lom (cornell-spheres.nff)
ideální zrcadlový odraz a lom

mnohonásobný ideální zrcadlový odraz a lom (cornell-spheres-crazy.nff)
mnohonásobný ideální zrcadlový odraz a lom

(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):
      • sample_i = (r,g,b)*cos fi*(light_triangle_area/num_samples)/(c0 + c1*d + c2*d^2)
    • cos fi = DotProd(light_triangle_normal, -shadow_ray.direction)
  • Osvětlení mapou prostředí
    • Mapa prostředí použita místo konstantní barvy pozadí - viz sglEnvironmentMap()
      • Načtení HDR mapy prostředí zařídí testapp.cpp
      • Využívá rozšíření NFF “B” jmeno_soubor
    • Použít jak pro primární, tak pro sekundární paprsky
    • Používat mapu prostředí pro paprsky neprotínající žádný objekt - mapa prostředí nahrazuje barvu pozadí
    • Mapování ze směru paprsku dir do souřadnice v obrázku (u,v) [0,1]x[0,1]
      • d = sqrt(dir.x^2 + dir.y^2)
      • r = d>0 ? acos(dir.z)/(2*PI*d) : 0.0
      • u = 0.5 + dir.x * r
      • v = 0.5 + dir.y * r
  • BONUS:
    • podpora textur (2 body)

Testovací scény a referenční obrázky

plošný zdroj světla (cornell-blocks-arealight.nff)
plošný zdroj světla

barevné plošné zdroje světla (cornell-blocks-arealight-color.nff)
barevné plošné zdroje světla

(V obou obrázcích je použito 16 paprsků na trojúhelníkovou plošku světelného zdroje.)

osvětlení mapou prostředí St. Peter's Basilica (basilica.nff/stpeters_probe.hdr)
osvětlení mapou prostředí St. Peter's Basilica

osvětlení mapou prostředí St. Uffizi Gallery (uffizi.nff/uffizi_probe.hdr)
osvětlení mapou prostředí St. Uffizi Gallery

 
Groups:
courses/a4m39apg/seminars/start.txt · Last modified: 2016/11/21 15:58 by hendrij