PV112 – Programování grafických aplikací 3. přednáška – Rasterizace, homogenní souřadnice, transformace souřadnic https://solarianprogrammer.com/2013/05/22/opengl-101-matrices-projection-view-model/ Rasterizace • Proces konverze primitiv do 2D obrázku Rasterizace • Dvě části: – Které obdélníky (pixely) mřížky okna jsou obsazeny – Každému obdélníku přiřadíme příslušnou hodnotu barvy a hloubky ofps.oreilly.com Princip rasterizace Detail rasterizace Fragment • Fragment = zlomek objektu v mřížce společně s přiřazenými parametry, např.: – Barva – Hloubka (hodnota Z) • Parametry se nazývají „fragment’s associated data“ Fragment • Fragment je definován dolním levým rohem, který leží v mřížce celočíselných souřadnic http://gpudesign.bafree.net/computer-graphics/graphics-pipeline Rasterizace bodů • Rasterizace bodů produkuje fragment pro každý pixel framebufferu, jehož střed leží uvnitř čtverce se středem v bodu [xw,yw], jehož délka strany je shodná s aktuální velikostí bodu. • Souřadnice bodů jsou ořezány na souřadnice okna [xw,yw]. Rasterizace bodů • Řízena pomocí glEnable(GL_PROGRAM_POINT_SIZE); gl_Pointsize = size; kde size je velikost vykreslovaného bodu. • Pokud je GL_PROGRAM_POINT_SIZE disabled, lze pro nastavení použít funkci glPointSize(float size) Rasterizace velkých bodů Je-li výsledek po zaokrouhlení sudý: (x,y) = (⌊xw + ½⌋ , ⌊yw + ½⌋) Rasterizace úseček • Řízena šířkou úsečky • Určení typu úsečky – x-hlavní – sklon v rozmezí uzavřeného intervalu [-1, 1] – y-hlavní – ostatní Rasterizace úseček • „diamond-exit“ pravidlo pro určení fragmentů: – Pro každý fragment f se středem [xf,yf] definujeme region tvaru diamantu, který je průsečíkem čtyř polorovin: Rf = {(x,y) | |x – xf| + |y – yf| < ½} Rasterizace úseček • Použití modifikovaného Bressenhamova algoritmu: – Vytvořená úsečka je „polootevřená“ = koncový fragment není vykreslen – Výhodné při vykreslování sady na sebe navazujících úseček Rasterizace úseček • Určení interpolace barev a hloubky: aktuální bod na úsečce počáteční bod koncový bod    2 ab abap t     yxp ,  aa yxa ,  bb yxb , Rasterizace úseček kde: je skalární součin je druhá mocnina vektorové délky t je v intervalu [0, 1] a t = 0 pro a, t = 1 pro b         abaaba yyyyxxxxabap     222 abab yyxxab  Homogenní souřadnice • Problém – dvě úsečky protínající se v nekonečnu • Převod kartézských souřadnic na homogenní = přidání další dimenze: – (X, Y) → (x, y, w) X = x/w Y = y/w www.art.com Homogenní souřadnice • Homogenní souřadnice mají přirozené aplikace v počítačové grafice • Vytváří základ pro projektivní geometrii, která je široce použita pro projekci třírozměrných scén do dvourozměrné roviny obrazu • Homogenní souřadnice také umožňují jednotné použití běžných grafických transformací a operací Definice homogenních souřadnic • Definice 1: Möbius Mějme pevně daný trojúhelník v rovině. Množina homogenních souřadnic pro bod p je definována jako hmotnosti přiřazené vrcholům trojúhelníka takové, že p se stane těžištěm trojúhelníka. a b c Těžiště p aw bw cw Bod p je vypočten jako Kde platí:  cwbwaw cba ,, 1 cba www wa, wb a wc se nazývají barycentrické souřadnice Definice homogenních souřadnic • Definice 2: Plücker – Pracuje se vzdálenostmi z daného bodu ke hranám pevného trojúhelníka – n+1 souřadnic reprezentuje n-dimenzionální bod a b c cl al bl Plückerovy souřadnice p =  cba lll Proč homogenní? • Invariance při „scalingu“ – Scaling Möbiových vah ani velikosti Plückerových souřadnic nezmění pozici bodu p • Příklad: (1, 2, 3) = (1/3, 2/3) (2, 4, 6) = (2/6, 4/6) = (1/3, 2/3) (4, 8, 12) = (4/12, 8/12) = (1/3, 2/3) A obecně tedy: (1a, 2a, 3a) = (1a/3a, 2a/3a) = (1/3, 2/3) Projektivní rovina • Normální rovina doplněná o body v nekonečnu • Body v nekonečnu jsou definovány homogenními souřadnicemi, kdy w = 0. • Projektivní rovina nemůže být reprezentována v konečných Euklidovských souřadnicích, může však být reprezentována v homogenních souřadnicích, což je základní důvod jejího použití v projektivní geometrii Projektivní rovina • Projektivní rovina je definována pomocí všech přímek a rovin procházejících skrz daný bod s, který nazýváme střed projekce. Jestliže jsou tyto přímky a roviny protnuty rovinou P, která neprochází skrz s, pak každý bod (nebo přímka na P) může být asociován s přímkou (nebo rovinou) procházející skrz s. s P Střed projekce Přímky na 2  Dvojrozměrný projektivní prostor ρ2 1. Množina všech tříd ekvivalence uspořádaných trojic nenulových vektorů v ε3, kde ekvivalence je vzájemná úměra dvou vektorů. 2. Množina všech přímek procházejících skrz počátek ε3. 3. Množina všech dvojic protilehlých bodů S2 jednotkové koule v ε3. Homogenní souřadnice reprezentují projektivní rovinu ρ2 zobrazením každého Euklidovského bodu (x’, y’) ∈ ε2 na [x y w] ∈ ε3, w<>0, který je členem třídy ekvivalence bodů v ρ2. Zobrazení je dosaženo ekvivalencí x’ ≈ x/w, y’ ≈ y/w. Dvojrozměrný projektivní prostor ρ2 • Skalární násobení vytváří nového člena dané třídy ekvivalence. • Jestliže jsou vybráni zástupci z průniku s rovinou w=1, pak vektorové sčítání dvou bodů v ρ2 vypočte zástupce středového bodu mezi těmito dvěma vektory. Například: [1, 2, 1] + [3, 4, 1] = [4, 6, 2] ≈ (2, 3) • Protože homogenní body reprezentují projekci, mohou také reprezentovat body v nekonečnu. w xy  432  032  132  232  5.032  Homogenní souřadnice ve 2D • Nejobecnější afinní mapování v Euklidovském prostoru je: nebo kde – p’ a p jsou body v – A je 2x2 matice reprezentující scaling a rotaci – c reprezentuje translaci (posun) cpAp '      yxyxyx ccApppp ,,, ''  2  Transformace – motivace • Chceme vykreslit 4 trojúhelníky s různými pozicemi a orientacemi Transformace • Transformace založeny na maticové algebře • Objekt uložíme pouze jednou a provedeme transformace: – Posun, rotace, scaling Kombinace transformací • Skládáním transformací dosáhneme složitějších efektů Transformace v OpenGL • Přesun souřadnic objektu do OpenGL bufferu • Vynásobení souřadnic transformační maticí ve vertex shaderu Základní vlastnosti násobení matic • Násobení není komutativní • Násobení je asociativní • Transponovaná znásobená matice odpovídá transponování původních matic zvlášť, ale v opačném pořadí • Podobně pro inverzní matici • Násobení maticí identity Modelovací matice • Násobení není komutativní => pořadí aplikování transformací je zásadní • Z matematického pohledu se transformace provádí postupným násobením souřadnic objektu základními transformačními maticemi • Alternativně ze použít jednu matici, která vznikla ze základních matic kde Modelovací matice • Tato matice M složená z elementárních transformací se v OpenGL nazývá modelovací matice (model matrix) • Do pipeline posíláme pouze jednu matici = efektivita Základní (afinní) transformace • Posun (translace) • Rotace • Škálování (scaling) Příklad • Rotace 2D vrcholu (x = 0.5, y = 0.5) o 90° okolo osy Z • Následný posun (0.1 v x, -0.2 v y, 0.5 v z) Za použití modelovací matice … Pořadí transformací • Je velmi důležité! • Protože násobení matic není komutativní C’=RT C’’=TR C’  C’’ • Jak můžeme transformace chápat? – 2 přístupy: – Globální souřadný systém – Lokální souřadný systém Globální souřadný systém • Aktuální matice je C = NML • Transformovaný vrchol v’ = Cv = NMLv tj., v’ = N( M( Lv)) Vrchol je nejprve transformován transformací L! Poslední volaná transformace je ta, která se první aplikuje na vrcholy Pořadí transformací • Rotace a poté posun • Posun a poté rotace x xx y y y z zz x xx y y y z zz Lokální souřadný systém • Operace jsou aplikovány na lokální souřadnicový systém • S operacemi se počítá v přirozeném pořadí Lokální vs. globální přístup Globální Lokální Pohledová matice • Pohledová matice (view matrix) velikosti 4x4 • Pro vytvoření pohledové matice obsahují knihovny často funkci LookAt definující matici pomocí tří parametrů: – eye = pozice pozorovatele – center = bod, do kterého se kamera dívá – up = směr nahoru pozorovatele Pohledová matice • Pozorovatel je na ose z, směr pohledu směrem k počátku souřadné soustavy • Vektor směrem nahoru v kladném směru osy y Pohledová matice • Aplikace pohledové matice V: Projekční matice • Simulace reálného chování scény – Objekty blíže kameře se jeví větší • Objekt pro vykreslení musí být umístěn v pohledovém ořezávacím objemu • Projekční matice ovlivňuje tento objem • Dva typy projekce: – Perspektivní – Ortografická Projekce Ortografická Perspektivní Perspektivní projekce Perspektivní projekce Perspektivní projekce • Vykreslování objektů v ε3 je prováděno přirozeně použitím jejich projekce do ε2 • Homogenní souřadnice reprezentují projekci Oko Objekt Obrazovka Perspektivní projekce • Pohled zboku: • Bod obrazu je vypočten z bodu objektu pomocí podobnosti trojúhelníků. Y Z y  zyx ,,  Dyx ,, '' D  0,0,0 zDyy //'  zDxx //'     zyDzxDyx /,/, ''   '' , yx  zyx ,, Perspektivní projekce • V okamžiku, kdy se D blíží k nekonečnu, se blíží k 0 a transformované body se stanou nekonečně vzdálenými.          Dzzyx DzyDzxDDzyDzxDzyx / 1//,/,/,, '''                          10/100 0100 0010 0001 z y x D Dw /1'  Matice perspektivní projekce • Vzniká násobením matice pro perspektivu a pro projekci Projekce Perspektiva Perspektivní projekce                                       0/100 0100 0010 0001 0/100 1100 0010 0001 1000 000 0010 0001 DD D Ortografická projekce Aplikování projekční matice • Vynásobení pohledové a modelovací matice Použití transformací v praxi • Ukázky používají knihovnu GLM (C++) • Pro Javu např. knihovna JOML • Vytvoření modelovací, pohledové a projekční matice • Po jejich vytvoření všechny obsahují jednotkovou matici Přesun matic do vertex shaderu • Na konci inicializace: Úprava vertex shaderu Nastavení projekce • Pomocí GLM: Nastavení posunu a rotace • Pomocí GLM: