====== 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 [[http://dcgi.felk.cvut.cz/cs/study/akademicka_pravidla|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í \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg0.pdf|Organizační záležitosti]] | | 2. | 10.10. | Rozdělení do týmů \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg1.pdf|Zadání úlohy 1]] | | 3. | 17.10. | Práce na úloze 1 | | 4. | 24.10. | Odevzdání úl. 1 \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg2.pdf|Zadání úlohy 2]] | | 5. | 31.10. | Práce na úloze 2 \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/memory-management.pdf|Rychlokurs správy paměti]] | | 6. | 7.11. | Odevzdání úl. 2 \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg3.pdf|Zadání úlohy 3]] | | 7. | 14.11. | Práce na úloze 3 | | 8. | 21.11. | Odevzdání úl. 3 \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg4.pdf|Zadání úlohy 4]] | | 9. | 28.11. | Práce na úloze 4 | | 10. | 5.12. | Odevzdání úl. 4 \\ [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg5.pdf|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: [[https://cent.felk.cvut.cz/courses/APG/sgl.h|sgl.h]], [[https://cent.felk.cvut.cz/courses/APG/sgl.cpp|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! * [[https://cent.felk.cvut.cz/courses/APG/testappdoc/html/sgl_8h.html|Dokumentace SGL API]] (vygenerováno automaticky ze souboru sgl.h) * Testovací aplikace pro všechny úlohy pro Windows a Linux (GLUT): [[https://cent.felk.cvut.cz/courses/APG/testapp.zip|testapp.zip]] * Poslední verze souboru [[https://cent.felk.cvut.cz/courses/APG/testapp.cpp|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 * [[https://cent.felk.cvut.cz/courses/APG/testappdoc/html/testapp_8cpp.html|dokumentace]] k testovací aplikaci * [[https://cent.felk.cvut.cz/courses/APG/testapp.exe|testapp.exe]] pro Windows, neoptimalizovaná verze ===== Odkazy ===== * Několik základních tříd pro práci s 3D vektory, definice paprsku: [[https://cent.felk.cvut.cz/courses/APG/pbrt_basic/|pbrt_basic]] (zdroj www.pbrt.org) * [[http://www.cs.utah.edu/%7Eshirley/books/fcg2/rt.pdf|Kapitola o ray tracingu z knihy P. Shirley et al. Fundamentals of Computer Graphics]] ===== Zadání úloh ===== ==== Úloha 1 ==== === Knihovna pro 2D grafiku, část A === [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg1.pdf|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\\ {{https://cent.felk.cvut.cz/courses/APG/results/test1a-ref.png?200x150|grafické elementy}} transformace\\ {{https://cent.felk.cvut.cz/courses/APG/results/test1b-ref.png?200x150|transformace}} zásobník transformačních matic\\ {{https://cent.felk.cvut.cz/courses/APG/results/test1c-ref.png?200x150|zásobník transformačních matic}} ==== Úloha 2 ==== === Knihovna pro 2D grafiku, část B === [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg2.pdf|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 [[http://www.fileformat.info/format/nff/spec/73edfe14899a415684320a2ba430b1c0/view.htm|NFF]] souboru. * O načtení dat ze souboru se postará dodaná testovací aplikace. * BONUS: * [[http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.3.211|výpočet osvětlovacího modelu na vrcholech polygonů]] (1 bod) === Referenční obrázky === vyplňování nekonvexního polygonu\\ {{https://cent.felk.cvut.cz/courses/APG/results/test2a-ref.png?200x150|vyplňování nekonvexního polygonu}} vyplňování grafických elementů\\ {{https://cent.felk.cvut.cz/courses/APG/results/test2b-ref.png?200x150|vyplňování grafických elementů}} rendering 3D scény - krychle se z-bufferem/bez něj\\ {{https://cent.felk.cvut.cz/courses/APG/results/test2c-ref.png?200x150|rendering 3D scény - krychle se z-bufferem/bez něj}} rendering 3D scény - data z NFF\\ {{https://cent.felk.cvut.cz/courses/APG/results/test2d-ref.png?200x150|rendering 3D scény - data z NFF}} ==== Úloha 3 ==== === Jednoduchý ray tracer, část A === [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg3.pdf|Zadání]] * Načtení scény ve formátu [[http://www.fileformat.info/format/nff/spec/73edfe14899a415684320a2ba430b1c0/view.htm|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ů: * paprsky generovat pomocí inverze složené transformační matice * ([[https://cent.felk.cvut.cz/courses/APG/invert-matrix.cpp|výpočet inverzní matice]], zdroj Numerical Recipies in C) * Průsečík paprsku s koulí (jeden z [[https://cent.felk.cvut.cz/courses/APG/ray-sphere.cpp|algoritmů]], zdroj http://www.devmaster.net/wiki/Ray-sphere_intersection) * Průsečík paprsku s trojúhelníkem (vyberte si z algoritmů [[https://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf|Moeller]], [[https://cent.felk.cvut.cz/courses/APG/triangle-pbrt.cpp|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ř. [[http://inst.cs.berkeley.edu/~cs294-13/fa09/lectures/cookpaper.pdf|Cook-Torrance]] nebo [[http://www.graphics.cornell.edu/pubs/2005/Wal05.html|Ward]] (1 bod) === Testovací scény a referenční obrázky === koule ([[https://cent.felk.cvut.cz/courses/APG/test3/nff/sphere.nff|sphere.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test3a-ref.png?200x200|koule}} Cornell box ([[https://cent.felk.cvut.cz/courses/APG/test3/nff/cornell.nff|cornell.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test3b-ref.png?200x200|Cornell box}} koule na podlaze ([[https://cent.felk.cvut.cz/courses/APG/test3/nff/floor_sph.nff|floor_sph.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test3c-ref.png?200x200|koule na podlaze}} ==== Úloha 4 ==== === Jednoduchý ray tracer, část B === [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg4.pdf|Zadání]] * Stínové paprsky * Sekundární paprsky: rekurzivní sledování paprsku * ideální zrcadlové odrazy, lomy ([[https://cent.felk.cvut.cz/courses/APG/refract.cpp|fragment kódu pro výpočet směru lomeného paprsku]]) * BONUS: * simulace hloubky ostrosti (1 bod) === Testovací scény a referenční obrázky === vržené stíny ([[https://cent.felk.cvut.cz/courses/APG/test4/nff/cornell-blocks.nff|cornell-blocks.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test4a-ref.png?200x200|vržené stíny}} ideální zrcadlový odraz a lom ([[https://cent.felk.cvut.cz/courses/APG/test4/nff/cornell-spheres.nff|cornell-spheres.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test4b-ref.png?200x200|ideální zrcadlový odraz a lom}} mnohonásobný ideální zrcadlový odraz a lom ([[https://cent.felk.cvut.cz/courses/APG/test4/nff/cornell-spheres-crazy.nff|cornell-spheres-crazy.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test4c-ref.png?200x200|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 === [[https://cent.felk.cvut.cz/courses/APG/PDF/seminar/apg5.pdf|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 * Více viz (www.debevec.org/Probes) * 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 ([[https://cent.felk.cvut.cz/courses/APG/test5/nff/cornell-blocks-arealight.nff|cornell-blocks-arealight.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test5a-ref.png?200x200|plošný zdroj světla}} barevné plošné zdroje světla ([[https://cent.felk.cvut.cz/courses/APG/test5/nff/cornell-blocks-arealight-color.nff|cornell-blocks-arealight-color.nff]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test5b-ref.png?200x200|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 ([[https://cent.felk.cvut.cz/courses/APG/test5/nff/basilica.nff|basilica.nff]]/[[https://cent.felk.cvut.cz/courses/APG/test5/nff/stpeters_probe.hdr|stpeters_probe.hdr]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test5c-ref.png?200x200|osvětlení mapou prostředí St. Peter's Basilica}} osvětlení mapou prostředí St. Uffizi Gallery ([[https://cent.felk.cvut.cz/courses/APG/test5/nff/uffizi.nff|uffizi.nff]]/[[https://cent.felk.cvut.cz/courses/APG/test5/nff/uffizi_probe.hdr|uffizi_probe.hdr]])\\ {{https://cent.felk.cvut.cz/courses/APG/results/test5d-ref.png?200x200|osvětlení mapou prostředí St. Uffizi Gallery}}