Textúrák, világmodellek 6. előadás Számítógépes grafika, PPKE-ITK, Benedek Csaba, 2010
Testek Ellenpéldák Érvényes testek: reguláris halmaz nem lehetnek alacsony dimenziós elfajulásai minden határpont mellett van belső pont Garantáltan érvényes testet építő módszerek 2.5 dimenziós eljárások speciális felületi modellezés: B-rep Konstruktív tömörtest geometria
2.5 dimenziós módszerek Kihúzás: extrude Forgatás: rotate
Felületmodellezők Test = határfelületek gyűjteménye Topológiai ellenőrzés (Euler tétel): csúcs + lap = él + 2
B-rep: Euler operátorok
Gyakorlati Euler operátorok Edge split csúcs + lap = él + 2 Poligon split Élzsugorítás v. csúcspont összevonás -Edge Collapse
Gyakorlati Euler operátorok Poligon kihúzás (Face extrude): ep: a poligon éleinek a száma 2ep új él, ep+1 új lap, ep új csúcs 1 eltűnő lap e’=e+2ep l’=l+ep+1-1 c’=c+ep l’+c’=l+c+2ep=e+2+2ep=e’+2
Poligon modellezés: téglatest
Poligon modellezés: 1. extruding poligon kihúzás
Poligon modellezés: 2. extruding mégegy poligon kihúzás
Poligon modellezés: 4. és 5. extruding még két poligon kihúzás
Poligon modellezés: 6. extruding
Subdivision simítás
Konstruktív tömörtest geometria (Constuctive Solid Geometry (CSG) Összetett testeket primitív testekből halmazműveletek (egyesítés, metszet, különbség) alkalmazásával építi fel Regularizált műveletek
CSG fa 15
Virtuális világ tárolása
Belső világ tárolása Geometria: pontok koordinátái Topológia: élek-pontok; lapok-pontok;... hierarchia: objektum-lapok-élek-pontok transzformáció: lokális és világkoordináta rendszerek modellező képszintézis világ VRML, 3DS, OBJ, DXF IGES, MB, MD2,... fáljkonv 17
Egyszerű hierarchikus modell Objektum obj1 szakasz1 Bezier kör Primitív point1 point1 point1 Pont point3 point4 point5 point6 18
Geometria kiemelése obj1 szakasz1 Bezier kör x y 19
Szárnyasél adatstruktúra class BRepCore { … public: void MEVVF(…); void MVE(float t, Edge& e); void MEF(Vertex& v1,Vertex& v2); void Move(Vertex& v, Vector p); }; class BRep : BRepCore { void FaceExtrude( ); void FaceSplit( ); void EdgeCollapse( ); void VertexSplit( ); él Pont +(x,y) lap 20
Hierarchikus színtér gráfok Ferrari haladási transzformáció Karosszéria Kerék1 transzformáció Kerék2 transzformáció Kerék Forgatási transzformáció kerék
Textúra leképzés Összetett mintázatú felületek (pl perzsaszőnyeg) BRDF-leírása nehézkes bonyolult modellezés, hosszú képszintézis Megoldás: textúra Bittérképes textúra: 2-D képet rendelünk a felülethez, a képpontok a felületelem színét tartalmazzák Procedurális textúra: generáló műveletsorral írjuk le a mintázatot
Textúra leképzés: anyagjellemzők változnak a felületen
(2D) Textúra leképzés Paraméterezés Nézeti transzformáció v (x,y,z) z u v (x,y,z) z y x Kép (elemei a „texel”-ek) vagy függvény x = fx(u,v) y = fy(u,v) z = fz(u,v) u,v [0,1]
Textúra-tér - képtér Textúra alapú leképzés: a textúra-térben levő ponthoz keresi meg a hozzá tartozó pixelt Hatékony, de nem garantálja hogy a textúra-térben kijelölt pontok a képernyőn is egyenletesen helyezkednek el („lyukas lehet a kép”) A képtér alapú leképzés: a pixelhez keresi meg a hozzá tartozó textúra elemet Vetítési transzformáció inverze! Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra leképzés sugárkövetésnél Inverz paraméterezés u v (x,y,z) z y x Gömb példa: x = x0 + r cos 2u sin v y = y0 + r sin 2u sin v z = z0 + r cos v u,v [0,1] u = 1/2 (atan2((y-y0), (x-x0)) +) v = 1/ acos( (z-z0)/r )
Modell-világ-képernyő transzf. Inkrementális képszintézis Paraméterezés Modell-világ-képernyő transzf. [Xh, Yh, Zh, h] = [x,y,z,1]TC (X,Y)= [Xh/h, Yh/h] u v (x3,y3,z3) Y (u1, v1) z (X1,Y1) (x2,y2,z2) (u3, v3) (u2, v2) (X3,Y3) (x1,y1,z1) (X2,Y2) y X x
Lineáris interpoláció Leképzés: 2x3 mátrix 6 egyenlet 6 ismeretlen u v u=au X+buY+cu v=av X+bvY+cv Y (X1,Y1) (u1, v1) (u3, v3) (u2, v2) (X3,Y3) u(X,Y) X (X2,Y2) X számláló u regiszter CLK S X Interpolációs feltétel: au lineáris u1=au X1+buY1+cu u2=au X2+buY2+cu u3=au X3+buY3+cu jó v1=av X1+bvY1+cv v2=av X2+bvY2+cv v3=av X3+bvY3+cv
P: homogén lineáris Tv: homogén lineáris u v (x,y,z) z y x Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Perspektíva helyes textúrázás Paraméterezés Modell-világ-képernyő transzf. xq=ax u+bxv+cx yq=ay u+byv+cy zq=az u+bzv+cz q=aq u+bqv+cq [Xh, Yh, h] = [x q,y q,z q,q]TV(4x3) (X,Y) = [Xh/h, Yh/h] u v Y [Xh1,Yh1,h1] (u1, v1) [Xh3,Yh3,h3] z (u3, v3) (u2, v2) y [Xh2,Yh2,h2] x X [u,v,1]TC(3x3) = [Xh, Yh, h], [u/h,v/h,1/h] = [X,Y,1]TC-1
TC-1 mátrixelemek [u/h,v/h,1/h] = [X,Y,1]TC-1 u v Y au, av , ah bu, bv , bh cu, cv , ch TC-1 = [u/h,v/h,1/h] = [X,Y,1]TC-1 u v Y [Xh1,Yh1,h1](X1,Y1) (u1, v1) (u3, v3) (u2, v2) [Xh3,Yh3,h3] ( X3,Y3 ) [Xh2,Yh2,h2](X2,Y2) X u1/h1 =au X1+buY1+cu u2/h2 =au X2+buY2+cu u3/h3 =au X3+buY3+cu v1/h1 =av X1+bvY1+cv v1/h1 =av X2+bvY2+cv v1/h1 =av X3+bvY3+cv 1/h1=ah X1+bhY1+cw 1/h2=ah X2+bhY2+cw 1/h3=ah X3+bhY3+cw au ,bu,cu av ,bv,cv ah ,bh,ch Tc-1: leképzés: 3x3 mátrix 9 egyenlet 9 ismeretlen
Perspektíva helyes textúrázás u v Y Perspektív helyes X lineáris au X+buY+cu u/h = au X+buY+cu v/h = av X+bvY+cv 1/h = ah X+bhY+ch u = v = ah X+bhY+ch av X+bvY+cv ah X+bhY+ch
Perspektíva helyes interpolációs hw. R G B X Textúra memória u v Div Div [u/h](X,Y) [v/h](X,Y) [1/h](X,Y) X számláló [u/h] regiszter [v/h] regiszter [1/h] regiszter S S S CLK au av ah
Textúra függvény definíciója Parametrikus felületeknél triviális 2. Implicit felületeknél és poligonmodellnél: közvetítő felületek v (u1,v1) (u3,v3) (u2,v2) (1,1) (0,0) u (x3,y3,z3) z (x2,y2,z2) (x1,y1,z1) közvetítő felület = téglalap y x
Henger (gömb) közvetítő felület
Téglalap közvetítő felület: textúratér nézet A kiterített közvetítő felületre texúrázott minta látható
Téglalap közvetítő felület: textúratér nézet
Textúrázott űrhajó
Textúrázás = kiterítés Torzításcsökkentés relaxációval
Textúrák szűrése v Y pixel ősképe u X
Mip-map adatstruktúra Y X
Bucka leképzés (Bump mapping) Tároljuk a normálvektort táblázatban vagy a felületi elmozdulást
Textúrák az OpenGL-ben Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
A textúraobjektumok elnevezése void glGenTextures(GLsizei n, GLuint *textureNames); n darab, jelenleg használaton kívüli textúraobjektum nevet a vissza a textureNames tömbbe. A visszaadott nevek nem feltétlenül egymást követő egészek Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
A textúraobjektumok létrehozása, használata void glBindTexture(GLenum target, GLuint textureName); Target: GL_TEXTURE_1D, GL_TEXTURE_2D, vagy GL_TEXTURE_3D, Ha először hívjuk a textureName azonosítóval: létrehoz egy textútraobjektumot és hozzákapcsolja a névhez Ha nem először hívjuk: textureName azonosítójú textúrát teszi kurrenssé Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra beállítása void glTexParameter{if}(GLenum target, GLenum pname, TYPE param); Target: GL_TEXTURE_1D, GL_TEXTURE_2D, vagy GL_TEXTURE_3D, Pname, param: számos paraméterezési lehetőség (lásd OpenGL referencia) Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra beállítás - példák glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); Nagyításhoz ill kicsinyítéshez használt interpoláció (GL_NEAREST mellett lehet még GL_LINEAR) Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra beállítás - példák glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); x és y (itt s és t) irányú ismétlődés (wrap=burkolat), lehet: GL_CLAMP - rögzített GL_REPEAT – ismétlődő parketta Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra beállítás - példák void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels); 2D struktúrát hoz létre. Target: GL_TEXTURE_2D (vagy más) level > 0 ha több felbontást használunk internalFormat: használt színkomponensek pl GL_RGBA GLsizei width, GLsizei height: a textúraobj mérete Border: határ szélessége (lehet 0) Format, type: a textúraadatok formátuma pl format=GL_RGBA, type= GL_UNSIGNED_BYTE texels: a textúra-minta adatait tartalmazó tömb Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Minta textúra inicializálása static GLubyte textDescriptor[height][width][4]; static GLuint texName[2]; ... glGenTextures(1, texName); glBindTexture(GL_TEXTURE_2D, texName[0]); glTexParameteri(…); … glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textDescriptor); Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra paraméterezése void glTexCoord{1234}{sifd}(TYPE coords); Textúra kooridnátái: s,t,r,q (~x,y,z,w), ahol q=1 ált. A kurrens (s,t,r,q) textúrakoordinátákat állítja be. Az ezt követően létrehozott csúcspontokhoz a rendszer ezt a textúrakoordinátát rendeli Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra paraméterezése, példa glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3d(1,-1,0); glTexCoord2f(0, 1); glVertex3d(-1,-1,0); glTexCoord2f(1, 1); glVertex3d(-1,1,0); glTexCoord2f(1, 0); glVertex3d(1,1,0); glEnd(); Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME
Textúra és saját szín kombinálása glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); GL_TEXTURE_ENV_MODE lehet: GL_REPLACE – a textúrával felülírjuk a saját v. megvilágításból adódó színt GL_MODULATE – a megjelenített színt a textúrából és a saját színből közösen számítjuk Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME Számítógépes Grafika 2010, PPKE ITK, Benedek Csaba Tanagyag forrás ® Szirmay-Kalos László, BME