Információ megjelenítés Számítógépes ábrázolás Dr. Iványi Péter
Raszterizáció OpenGL Mely pixelek vannak a primitíven belül fragment generálása minden ilyen pixelre Attribútumok (pl., szín) hozzárendelése minden fragment-hez Alkalmazás Vertex létrehozás Vertex műveletek Primitív objektumok Primitív műveletek Raszterizáció Fragment műveletek Framebuffer Képernyő
Két alapvető művelet Fragment kiválasztás Tulajdonság hozzárendelés Szín, mélység
Fragment kiválasztás Generáljunk egy fragment-et minden pixelhez amelyet metsz a primitív Metszés jelentése: Primitív tartalmazza a pixel közepét Metszi a pixel négyzetét Metszi a szűrő függvényt
Primitív tartalmazza a pixel közepét
Primitív metszi a pixel négyzetét
Multisample raszterizáció 4x4 mintaper pixel
4x4 pixel per négyzet
Szűrő függvény használata Ha a függvény metszi a primitívet, akkor generálunk egy fragment-et
Fragment kiválasztás Mi van ha a primitívnek nincs területe? Pont és vonal Lehetőségek: Szabály alapú N x N pixel egy pont Bresenham vonal Terület hozzárendelés Kör egy pont helyébe Téglalap egy vonal helyébe
Bresenham algoritmus Vonal rajzolása q pontból r pontba q = (q x, q y ) r = (r x, r y ) Egy vonal implicit definíciója: f(x,y) = ax by c = 0 A meredekség 0 és 1 közé esik Ha nagyobb mint 1 akkor felcseréljük x és y szerepét és a meredekség megint 0 és 1 közé esik
Definiáljuk: Bresenham algoritmus d x = r x q x, d y = r y q y Ebből: a = d y, b = d x és c = (q x r y r x q y ) Mindegyik érték egész szám!!! f(x, y) > 0 esetén a pontok alatta vannak f(x, y) < 0 esetén a pontok felettevannak
Bresenham algoritmus Utoljára a p = (p x, p y ) pixelt rajzoltuk meg A kérdés, hogy egy adott x értékhez melyik a legközelebbi y érték (pixel)
Bresenham algoritmus Mivel a dőlés 0 és 1 között van így csak az E = (p x 1; p y )és NE = (p x 1; p y 1) pontok lehetnek
Bresenham algoritmus q érték a pontos y koordináta m adja meg a középértéket: m = p y 1/ Ha q < m Akkor az E pontot választjuk Ha q > m Akkor az NE pontot választjuk
Bresenham algoritmus Döntési érték (D), f értéke a m pozícióban D = f ( p x 1, 1/ ) Ha D > 0 válasszuk a NE pontot Ha D < 0 válasszuk az E pontot x p y 1 = a( px 1) b py c = ap bp (a b c) y
Előnyök: D egész érték Hátrány Bresenham algoritmus Minimum két szorzatot és két összeadást kell elvégezni (például előszámítunk néhány értéket) A trükk: D-t folyamatosan módosítjuk
Ha E pontot választottuk A következő középpont: (p x ; p y (1/)) y y x y x y x y x uj d D a D a c b a bp ap c b a bp ap c p b p a p p f D ) ( ) (4 1 ) ( ) 1/, ( = = = = = =
Ha NE pontot választottuk A következő középpont: (p x ; p y 1 (1/)) ) ( ) ( ) ( ) ( ) 3 (4 3 ) ( ) 1/ 1, ( x y y x y x y x y x uj d d D b a D b a c b a bp ap c b a bp ap c p b p a p p f D = = = = = =
Bresenham algoritmus Minden lépésben csak egy összeadást kell végrehajtani, ha a d y és (d y -d x ) értékeket előszámítjuk Jelentős hatékonyság növelés
Bresenham algoritmus D kezdeti értéke: x y y x y x y x y x kezdo d d q q b a b a c bq aq c q b q a q q f D = = = = = vonalon van a ), ( mivel 0 ) ( ) ( 1 1) ( ) 1/ 1, (
Bresenham algoritmus void bresenham(intpoint q, IntPoint r) { int dx, dy, D, x, y; dx = r.x - q.x; // vonal szélesség dy = r.y - q.y; // vonal magasság D = *dy - dx; // D kezdeti y = q.y; // (q.x,q.y) kezdünk for (x = q.x; x <= r.x; x) { writepixel(x, y); if (D <= 0) D = *dy; // E pont else { D = *(dy - dx); y; // NE pont } } }
Bresenham algoritmus Az algoritmus kiterjeszthető görbékre is Kör, ellipszis stb
Régió kitöltés módszer Poligon alapú Pixel alapú
Pixel alapú kitöltés A peremen pixelekkel megadjuk, majd a köztük levő részt kitöltjük. 4-kapcsolt 8-kapcsolt
Pixel alapú kitöltés Egy pontból elindulva addig lépkedünk amíg egy perem pixelhez érünk. Minden elért pixelt kitöltési színűre színezzük Rekurzíven kell végrehajtani Recursive Flood Filling
Recursive Flood Filling void floodfill(intpoint p) { if (getpixel(p.x, p.y) == backgroundcolor) { setpixel(p.x, p.y, regioncolor); floodfill(p.x - 1, p.y); // balra floodfill(p.x 1, p.y); // jobbra floodfill(p.x, p.y - 1); // le floodfill(p.x, p.y 1); // fel } }
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Recursive Flood Filling
Rejtett vonalas ábrázolás Hidden line removal Adva vannak poligonok és egy nézőpont Csak a látható részeket akarjuk ábrázolni Minden rész sík és nem átlátszó Precizitás Objektum szintű Pixel szintű nem nagyítható egyszerű és gyors
Legrosszab eset Rejtett vonalas ábrázolás O(n ) komplexitás
Egyszerűsítés Rejtett vonalas ábrázolás Back face culling Hátlapok nem láthatók View frustum culling Néző dobozon kívüli elemek nem láthatók
Rejtett vonalas ábrázolás Painter s algoritmus (festő) Mélység szerinti rendezés Legtávolabbi objektumot először kirajzoljuk A közelebbi objektumot csak utána rajzoljuk, ami kitakarhatja a távolabbi objektumot
Rejtett vonalas ábrázolás Általában a poligon egy reprezentatív pontját használjuk Pl. közepét vagy legtávolabbi pontját Nem működik mindig
Rejtett vonalas ábrázolás Kisebb poligonokra lehet felvágni az eredeti poligont
Depth buffering Gyors és egyszerű Z-buffer algoritmus Nincs tárgyak rendezése, összehasonlítása, metszéspontok számítása Nem csak poligonokra jó Sok memóriát igényel Pixel pontos eredményt produkál Hardware-ben szokták használni
1 4 1 4 Z-buffer algoritmus Color Buffer 8 16 8 16 Depth Buffer Display
Z-buffer algoritmus Minden pixelnél két adatot tárolunk A színt A mélység, vagy távolság a nézőtől Algoritmus: if(pixel->z < depthbuffer(x,y)->z ) { depthbuffer(x,y)->z = pixel->z; colorbuffer(x,y)->color = pixel->color; }
Z-buffer algoritmus
Z-buffer algoritmus P a pont interpolálható P 0 és P 1 pontokból P b pont hasonlóan A két pontból a P pixel mélysége is interpolálható