390 likes | 484 Views
Inkrementális 3D képszintézis. Szirmay-Kalos László. Inkrementális képszintézis. Sugárkövetés számítási idő Pixelszám × Objektumszám × (Fényforrás szám+1) koherencia: oldjuk meg nagyobb egységekre feleslegesen ne számoljunk: vágás
E N D
Inkrementális 3D képszintézis Szirmay-Kalos László
Inkrementális képszintézis • Sugárkövetés számítási idő Pixelszám × Objektumszám × (Fényforrás szám+1) • koherencia: oldjuk meg nagyobb egységekre • feleslegesen ne számoljunk: vágás • transzformációk: minden feladathoz megfelelő koordinátarendszert • vágni, transzformálni nem lehet akármit: tesszelláció
3D inkrementális képszintézis Tmodell Tview Modell referencia helyzetben Kamerakoordináta r. Tesszelláció Világkoordináta r. Tpersp Tviewport z Képernyőkoordináta r. Láthatóság + vetítés Takarás és vetítés triviális! Normalizált eszközkoordináta r. Vágás Árnyalt kép
Tesszelláció r(u,v) u r(u,v) v • Felületi pontok kijelölése: rn,m = r(un,vm) • Normálvektor: • „Paramétertérben szomszédos” pontokból háromszögek N(un,vm)= N1 u,v r(u,v) N2 r2 N(u,v) N3 r1 r3
Modellezési transzformáció z 1. skálázás: sx, sy, sz 2. orientáció: , , 3. pozíció: px, py, pz y x 1 1 1 px py pz 1 sx sy sz 1 1 R TM=
(R21,R22,R23) z Orientáció (R31,R32,R33) y (R11,R12,R13) x cos -sin 1 sin cos 1 cos sin -sincos 1 1 1 cossin -sincos 1 0 0 0 0 0 0 1 R TM = = Csavaró: Roll Billentő: Pitch Forduló: Yaw Orientáció = ortonormált mátrix Orientácó: 3 szabadságfok Orientáció = három szög+fix tengelyek vagy tengely+szög
Emlékeztető: Más algebrai alap? Forgatás = egység abszolút értékű komplex számmal szorzás • Idáig (2D-ben) • Pont = számpár • Eltolás = számpár (vektor) • Elforgatás, skálázás, nyírás, stb. = 22-s mátrix • Más lehetőség? • Pont = komplex szám (z) • Eltolás = komplex szám (összeadás): z’ = z + v • Forgatás, skálázás (forgatva nyújtás) = komplex szám (szorzás): • z’ = z * f , ahol f = r eiφ
Kvaterniók • Komplex számok általánosítása • q= [s,x,y,z] = [s,w] = s+xi+yj+zk • q1+q2 = [s1+s2, x1+x2, y1+y2, z1+z2] • aq = [as,ax,ay,az] • |q| = s2+x2+y2+z2 • Szorzás: • i2 = j2 = k2 = ijk = -1, ij=k, ji=-k, jk=i, kj=-i, ki=j, ik=-j • Szorzás asszociatív, de nem kommutatív, • Összeadásra disztributív • Van egységelem: [1,0,0,0] • Van inverz, konjugált/absnégyzet mint a komplexnél: q-1 = [s,-w]/|q|2, q-1q= qq-1=[1,0,0,0]
Egység kvaternió = forgatás az origón átmenő w tengely körül • q= [cos(/2), w sin(/2)], |w| = 1 • q[0,u]q-1 = [0,v] • v az u elforgatottja a w körül szöggel • wegységvektor körül szöggel forgató mátrix: • (0, R11,R12,R13) = q[0,1,0,0]q-1 • (0, R21,R22,R23) = q[0,0,1,0]q-1 • (0, R31,R32,R33) = q[0,0,0,1]q-1 • Rodriquez formula • glRotate(alpha, wx, wy, wz);
Specifikációhoz és főleg interpolációhoz kvaternió Kvaternió versus mátrix • Orientáció specifikációja: • Kvaternió: tengely + szög • Mátrix: három Euler szög (elemi forgatások a koordinátatengelyek körül) • Orientáció interpolációja: • Kvaternió: „közbülső” egységkvaterniók, természetes • Mátrix: Euler szögek, természetellenes • Orientációváltás végrehajtása: • Kvaternió: 2 kvaternió szorzás, forgatásokkal konkatenálható! • Mátrix: vektor-mátrix szorzás, bármilyen homogén-lináris transzformációval konkatenálható! Az orientáció váltás végrehajtásához mátrix
Transzformációk • Modellezési transzformáció: [r,1] Tmodell = [rvilág,1] [N,0] (Tmodell)T= [Nvilág,0] • Kamera transzformáció: [rvilág,1] Tview =[rkamera, 1] [Nvilág,0] (Tview)T= [Nkamera,0] • Perspektív transzformáció: [rkamera,1] Tpersp =[rképernyőh, h] • Összetett transzformáció: TmodellTviewTpersp =TC -1 -1
Nézeti téglalap Kamera modell szem fp vup fov eye asp bp z vrp (lookat) y x Mi: Camera obscura
Világból a képernyőre y eye z z 2. Kamera 1 Bal!!! y 4. Képernyő 1 x 1. Világ 3. Normalizált képernyő
eye v w u w v u Kamera transzformáció vup w = (eye-lookat)/|eye-lookat| u = (vupw)/|wvup| v = wu lookat z -1 ux uy uz0 vx vy vz0 wx wy wz0 0 0 0 1 y 1 0 00 01 00 0 0 10 -eyex-eyey -eyez1 x [x’,y’,z’,1] = [x,y,z,1] uxvxwx0 uyvywy0 uzvzwz0 0 0 0 1 gluLookAt(eye,lookat,vup)
Perspektív transzformáció +1,1 -1,1 bp·tg(fovy/2) fp·tg(fovy/2) z* 1 -1 -fp -bp (x, y, -fp) (x/(fp·tg(fovx/2)), y/(fp·tg(fovy/2)), -1) (x, y, -bp) (x/(bp·tg(fovx/2)), y/(bp·tg(fovy/2)), +1)
Perspektív transzformáció gluPerspective(fov,asp,fp,bp) 1/(tg(fov/2)·asp) 0 0 0 0 1/tg(fov/2) 0 0 00 -(fp+bp)/(bp-fp) -1 00 -2fp·bp/(bp-fp) 0 [x, y, -fp, 1] [x/(tg(fovx/2)), y/(tg(fovy/2)), -fp, fp] (x/(fp·tg(fovx/2)), y/(fp·tg(fovy/2)), -1) [x, y, -bp, 1] [x/(tg(fovx/2)), y/(tg(fovy/2)), bp, bp] (x/(bp·tg(fovx/2)), y/(bp·tg(fovy/2)), +1) [Xh,Yh,Zh,h] = [xc,yc,zc,1] Tpersp [X,Y,Z,1] = [Xh/h, Yh/h, Zh/h,1] h = -zc
Képszintézis csővezeték primitívek csúcspontok Vágás Modell: x,y,z Tmodell Tpersp Tview Tviewport Vetítés Takarás Homogén osztás Rasztertár: X, Y Huzalváz képszintézis esetén kimaradhat 1
Vágni a homogén osztás előtt kell [X(t),Y(t),Z(t),h(t)]=[X1,Y1,Z1 ,h1]·t + [X2,Y2,Z2,h2]·(1-t) Homogén lineáris transzformáció konvex kombinációkat konvex kombinációkba visz át. Ideális pont h = -zc Szakasz zc<0 zc<0 zc>0 zc<0
Vágás homogén koordinátákban Cél: -1 < X = Xh/h < 1 -1 < Y = Yh/h < 1 -1 < Z= Zh/h < 1 Vegyük hozzá: h > 0 (mert h = -zc) h = Xh Belül Kívül -h < Xh < h -h < Yh < h -h < Zh < h [3, 0, 0, 2] h = 2< Xh = 3 [2, 0, 0, 3] h = 3> Xh = 2
Szakasz/poligon vágás -h < Xh < h -h < Yh < h -h < Zh < h h = h1·(1-t)+h2 ·t = = Xh = Xh1·(1-t) + Xh2·t t = … h = Xh [Xh1,Yh1,Zh1,h1] Xh = Xh1 · (1-t) + Xh2 · t Yh = Yh1 · (1-t) + Yh2 · t Zh = Zh1 · (1-t) + Zh2 · t h = h1 · (1-t) + h2 · t [Xh2,Yh2,Zh2,h2]
Huzalváz képszintézis poligon élek (Xh,Yh,Zh,h) Modell: x,y,z Tesszel- láció Vágás TC Homogén osztás Szín (X,Y,Z) 2D szakasz rajzolás Nézet transzf Vetítés Rasztertár: X, Y (X,Y)
Tömör képszintézis 1 • Képernyő koordinátarendszerben • vetítősugarak a z tengellyel párhuzamosak! • Objektumtér algoritmusok (folytonos): • láthatóság számítás nem függ a felbontástól • Képtér algoritmusok (diszkrét): • mi látszik egy pixelben • Sugárkövetés ilyen volt!
r3 Hátsólab eldobás: back-face culling n = (r3 -r1)(r2 -r1) r2 r1 nz < 0 nz> 0 z • Lapok a nézeti irányban: • Kívülről: lap, objektum: elülső oldal • Belülről: objektum, lap: hátsó oldal • Feltételezés: • Ha kívülről, akkor csúcsok óramutatóval megegyező körüljárásúak
Z-buffer algoritmus 2. 1. 3. = 1 z 0.6 0.3 0.3 0.6 0.8 Mélység buffer Z-buffer Szín buffer
Z: lineáris interpoláció (X2,Y2,Z2) Z Z(X,Y) = aX + bY + c (X1,Y1,Z1) Y (X3,Y3,Z3) Z(X,Y) X Z(X+1,Y) = Z(X,Y) + a
Z-interpolációs hardver X Z(X,Y) X számláló Z regiszter CLK S a
Inkremens (triangle setup) (X2,Y2,Z2) Z Z1= aX1 + bY1 + c Z2= aX2 + bY2 + c Z3= aX3 + bY3 + c n (X1,Y1,Z1) Y Z3-Z1= a(X3-X1) + b(Y3-Y1) Z2-Z1= a(X2-X1) + b(Y2-Y1) (X3,Y3,Z3) -nx X (Z3-Z1)(Y2-Y1)-(Y3-Y1)(Z2-Z1) (X3-X1)(Y2-Y1)- (Y3-Y1)(X2-X1) a= Z(X,Y) = aX + bY + c nxX+nyY+nzZ+d = 0 i jk X3-X1Y3-Y1 Z3-Z1 X2-X1Y2-Y1 Z2-Z1 nz n = (r3 -r1)(r2 -r1)=
Árnyalás L(V) SlLl (Ll)*fr (Ll,N,V)cos ’ • Koherencia: ne mindent pixelenként • Háromszögenként: • csúcspontonként 1-szer, belül az L „szín” lineáris interpolációja: Gouraud árnyalás, (per-vertex shading) • pixelenként, a Normál (View, Light) vektort interpoláljuk: Phong árnyalás, (per-pixel shading)
Gouraud (per-vertex) árnyalás N1 r2 N2 R(X,Y) = aX + bY + c G(X,Y) =… B(X,Y) =… N3 r1 r3 Modell [+kamera] Perspektív + nézeti N1 r1 R(X,Y) L1 V1 L2 N2 L3 r2 N3 r3 R(X+1,Y) = R(X,Y) + a (per-vertex shading) Képernyő
Z-buffer + Gouraud árnyaló hw. X Z B R G X számláló R regiszter G regiszter B regiszter z regiszter S S S S aR aG aB az
Gouraud árnyalás hasfájásai • További bajok: • anyagtulajdonság konstans • árnyék nincs • különben a színt nem lehet • interpolálni spekuláris ambiens diffúz
Phong (per-pixel) árnyalás N1 r2 N2 N(X,Y) = AX + BY + C L(X,Y) =… V(X,Y) =… N3 r1 r3 Modell [+kamera] N N1 L L1 Vektor másolás V1 Normalizálás! N1 V L1 r1 Pontokra: perspektív + nézeti V1 L2 N2 L3 r2 N3 r3 (per-pixel shading) Képernyő
Gouraud Phong Phong Gouraud versus Phong Gouraud
v u Inkrementális képszintézis Model-camera-perspective-viewport transzformáció Paraméterezés x=axu+bxv+cx y=ayu+byv+cy z=azu+bzv+cz [Xh, Yh, Zh, h] = [x,y,z,1]TC (X,Y)=[Xh/h, Yh/h] (x1,y1,z1) (u1, v1) Y (X1,Y1) z (x2,y2,z2) (X3,Y3) (u3, v3) (u2, v2) (x3,y3,z3) (X2,Y2) y X x [Xh, Yh, h] = [u,v,1] T, aholh = -zc [u/h, v/h, 1/h] = [X,Y, 1] T-1
v u Lineáris interpoláció Y (u1, v1) (X1,Y1) (X3,Y3) (u3, v3) u=au X+buY+cu v=av X+bvY+cv (u2, v2) (X2,Y2) X Interpolációs kényszerek: u1=au X1+buY1+cu u2=au X2+buY2+cu u3=au X3+buY3+cu referencia lineáris v1=av X1+bvY1+cv v2=av X2+bvY2+cv v3=av X3+bvY3+cv
v u Perspektíva helyes textúrázás Y (u1, v1) (X1,Y1) (X3,Y3) (u3, v3) (u2, v2) (X2,Y2) Au X+VuY+Cu u = v = Ah X+BhY+Ch X Av X+BvY+Cv u/h =Au X+BuY+Cu v/h = Av X+BvY+Cv 1/h =Ah X+BhY+Ch Ah X+BhY+Ch h = -zc
Perspektíva helyesinterpolációs hw. R G B X Y X Y Textúra memória v u Div Div [1/h](X,Y) [v/h](X,Y) [u/h](X,Y) [1/h] regiszter [v/h] regiszter X számláló [u/h] regiszter S S S CLK ah av au