A SZÁMÍTÓGÉPES GRAFIKA ALAPJAI
2.4. A sugárkövetési algoritmus
2.4.2. A metszéspontok kiszámításának optimalizálása
A legegyszer¶bb esetben, amelyben a sugárkövet® algoritmus csak az objek-tumok láthatóságát határozza meg, minden pixelre metszetszámításokat végez egy sugár és a 3D objektumok között. Ily módon, pl. egy 1024×1024 felbontású képerny®n, melyen 10 objektum van megjelenítve, 10 485 760 metszetszámolás szükséges. Ez hosszú id®t igényel még egy performens gép esetén is. Elvégzett mérések alapján megállapították [24], hogy a metszetszámolások 7595% id®t vesznek igénybe az egész algoritmus végrehajtási idejéb®l. Éppen ezért szüksé-ges ezen számolások optimalizálása és ezeknek csökkentése.
Azokban az egyenletekben, amelyekb®l megkapjuk egy sugár metszéspont-ját egy objektummal, sok tényez® állandó egy sametszéspont-játos sugárra vagy akár az egész képre nézve. Ezek a tényez®k el®re kiszámíthatók és felhasználhatók más olyan esetben, amikor a sugár egy ugyanolyan típusú objektumot metsz.
Módszereket fejlesztettek ki egy sugár és egy objektum metszésének gyors meghatározására. Például ha a sugár aztengely mentén halad, a metszéspontok kiszámítása egyszer¶södik, de ez a feltétel egy transzformációt von maga után mind a sugár, mind azon objektumok esetén, amelyeket metszhet a sugár. A transzformáció által meg kell határozni a legközelebbi objektumot, az-n történ®
mélységrendezéssel (depth-test). A metszéspont meghatározása után az inverz transzformációt kell alkalmazni az algoritmus folytatásához.
Szabálytalan objektumok esetén a metszési tesztek sok id®t emésztenek fel.
Ebben az esetben optimalizálni kell. Az egyik optimalizálási lehet®ség, ha az illet® objektumot beírjuk egy szabályos testbe: gömbbe, ellipszoidba, hengerbe, derékszög¶ parallelipipedonba stb. A metszetszámítások csak akkor hajtódnak végre, ha a sugár metszi a befoglaló testeket.
A sugárkövet® algoritmus gyorsítása befoglaló testek segítségével függ a tes-tek formájától. Például a gömböt gyakran használják befoglaló testként, mivel nagyon egyszer¶en lehet kiszámítani a metszéspontját egy sugárral, de egyik hátránya, hogy nem fogja be jól a nyújtott alakú objektumokat, a metszés kiszá-mításának az egyszer¶sége nem szabad az egyedüli kritérium legyen a befoglaló testek meghatározásánál.
Egy objektum metszései kiszámításának költségét a következ® összefüggés adja meg:
T =b·B+i·I,
ahol:T az összköltség;b a tesztek száma egy sugár és a befoglaló test között;
B a sugár és a befoglaló test közötti metszési teszt költsége;i a metszési tesztek száma egy sugár és az objektum között (i 6 b); I pedig a sugár és objektum közötti metszési tesztek költsége.
A két tényez® függ egymástól. A befoglaló test egyszer¶sítése maga után vonja aBcsökkenését, de ugyanakkorInövekedését.
Egy egyszer¶ befoglaló test egy konvex poliéder, amely négy pár párhuza-mos síkból áll. Ezek körbefogják az objektumot. A párhuzapárhuza-mos síkok 0, 45, 90, illetve 135-ra vannak megd®ltve a vízszinteshez képest [30].
Egy sugár metszése a befoglaló poliéderrel síkokkal történ® metszést von maga után. A metszéseket külön minden párhuzamos sík-párra teszteljük.
Legyen t1 a sugár és a meggyel®höz közelebb álló síkkal lev® metszet paramétere, és t2 a távolabb álló síknak megfelel® paraméter. Feltételezésünk alapjánt1< t2.
Egy sugár metszetét a befoglaló poliéderrel at1minimum értékek maximu-ma és at2maximum értékek minimuma adja meg.
Ha a végs®t1érték nagyobb lesz, mint a végs®t2érték, akkor a sugár nem metszi a befoglaló poliédert, és így nem metszi az objektumot sem. Ellentett esetben a sugár metszi a befoglaló testet, és ekkor meg kell vizsgálni, hogy a sugár metszi-e az objektumot vagy sem (a befoglaló test metszése szükséges, de nem elégséges feltétel).
2.5. Árnyalás
Raszteres (pixeles) megjelenít®kön a látható felületek színének és fényer®s-ségének helyes megválasztásával el®segíthetjük a tárgyak alakjának és tömörsé-gének érzékeltetését. Ezt nevezzük árnyalásnak.
A háromdimenziós színtér raszterképének valóságh¶sége az árnyalást el®-idéz® zikai jelenségek sikeres szimulációjától függ. Árnyalási modellt haszná-lunk a felület megjelenítésekor a fényer®sség és a szín kiszámításához.
Generatív számítógépes grakában a következ® árnyalási modellek terjed-tek el:
2.32. ábra. Szabálytalan test befoglaló poliéderének meghatározása 0, 45, 90, illetve 135-os síkokkal (metszet-kép)
drótvázas modell,
árnyalási poliéder használata, Gouraud-módszer,
Phong-módszer,
pontok független árnyalása.
Drótvázas modell (wireframe) esetén a geometriai modell három- és négy-szögekb®l áll, csak az élvonalak látszanak.
Árnyalási poliéder használata (at) esetén a megjelenítés a lapok független árnyalásával történik.
A Gouraud-módszer folytonos árnyalást állít el®. Mindegyik lap csúcspont-jaiban meghatározza a normálisokat, majd ezekb®l a csúcsok színét. A lapon belüli árnyalást a csúcsponti értékekb®l interpolálja. A Gouraud-módszer akkor jó, ha a lapon belül a szín valóban közelít®leg lineárisan változik. Ez igaz a diffúz visszaver®dés¶ objektumokra, de elfogadhatatlan tükrös, illetve spekulá-ris visszaver®dés¶ felületekre. A lineáspekulá-ris interpoláció ilyen esetben egyszer¶en kihagyhatja vagy szétkenheti a fényforrás tükröz®d® foltját.
A Phong-módszer is folytonos árnyalást állít el®, alapelve, hogy nem a szí-neket, hanem a normálvektorokat interpolálja, és ebb®l számítja ki minden pixel színét. Több számítást igényel, de valóságh¶bb eredményt ad. A Phong-módszer a színtérben nemlineáris interpolációnak felel meg, így nagyobb poligonokra is megbirkózik a tükrös felületek gyorsan változó radianciájával.
Pontok független árnyalásakor minden pontban egyenként meghatározzuk a normálvektort és ebb®l a pixel színét. A legpontosabb, de a leglassúbb számí-tási modell.
2.33. ábra. Gömb képe drótvázas, poliéderes, Gouraud-, Phong- és ponton-kénti árnyalással
2.6. A vágás
A generatív számítógépes graka segítségével el®állított grakus modell a teljes színteret magába foglalja, a számítógép képerny®jén azonban lehet, hogy ennek csak egy része fog látszani, egy része pedig kilóg a képb®l.
2.34. ábra. POV-Ray-ben el®állított színtér bevágása az ablakba A modellb®l mindig csak annyit szabad mutatni, amennyi látszik. Sem a takart, sem a képb®l kilógó részek nem szabad felkerüljenek a generált képre.
A következ®kben [61] alapján összefoglaljuk a vágás módszereit:
a modellt vágjuk le a megjelenítés el®tt, azaz számítsuk ki a metszés-pontokat, és az új végpontokkal rajzoljunk;
ollózás: pásztázzuk a teljes modellt, de csak a látható képpontokat jele-nítjük meg (ellen®rizzük minden(x, y)-ra);
a teljes modell legenerálása egy munkaterületre, majd innen másoljuk át a megfelel® látható részt.
A pontok vágása egyszer¶, egyP(x,y)pont akkor látható, haxmin6 x6 xmax, ésymin6y 6ymax, ahol(xmin, ymin),(xmax, ymax)az ablakot (képerny®t) körbefogó téglalap bal fels® és jobb alsó sarkának a koordinátái.
Vonalak, szakaszok esetén elegend® a végpontokat vizsgálni. Ha mindkét végpont belül van, akkor a teljes vonal belül van, nem kell vágni. Ha csak
egy végpont van belül, akkor ki kell számítani a metszéspontot a téglalappal és vágni kell. Ha mindkét végpont kívül van, akkor lehet, hogy nincs közös része a vágási téglalappal, további vizsgálat szükséges. A vágási téglalap minden élére megvizsgáljuk, hogy van-e az élnek közös része az egyenessel (egyenesek metszéspontjának a meghatározása, élen belül van-e a metszéspont?).
Vonalak vágására Cohen és Sutherland adott optimális vágási algoritmust bitkódok segítségével [88].
A CohenSutherland-féle szakaszvágáshoz el®zetes vizsgálatokra és kódo-lásra van szükség.
Legyen a szakasz két végpontja (x1, y1) és (x2, y2). Mindkét végpont a következ® táblázat szerint kódot kap (kód1, kód2), annak megfelel®en, hogy melyik tartományban van:
1001 1000 1010 0001 0000 0010 0101 0100 0110
Ha a végpontok belül vannak, akkor nincs mit vágni, mindkét végpont kódja: kód1= kód2= 0000 (triviális elfogadás).
Ha mindkét végpont a vágási téglalapon kívül van, ugyanazon az olda-lon, vagyis hax1,x2< xmin(***1), vagy hax1,x2> xmax(**1*), vagy hay1,y2 < ymin (*1**), vagy hay1,y2 > ymax (1***), akkor a szakasz nem látható, bittenként kód1ÉS kód2= 1 (triviális elvetés).
Különben a szakasz metszi a vágási téglalap valamelyik oldalát, tehát egy részét ki kell rajzolni (el kell fogadni), egy részét pedig nem (el kell vetni). Ekkor vegyünk egy küls® végpontot (legalább az egyik az, ha mindkett® az, válasszuk az els®t felülr®l lefelé és jobbról balra haladva), számítsuk ki a metszéspontot, a két részre bomlott szakasz egyik fele pedig az el®bbi pont alapján triviálisan elvethet®.
A CohenSutherland-féle szakaszvágás gyakorlati megvalósítását lásd a 6.4.
(Az OpenGL lehet®ségei, alapvet® rajzolási algoritmusok) fejezetben.
Körök, ellipszisek vágására fogjuk körbe az alakzatot egy kerettel (írjuk be a kört egy négyzetbe, az ellipszist egy téglalapba). Ha a keret belül van, akkor a kör vagy ellipszis is belül van, nem kell vágni. Ha a keret kívül van, akkor az alakzat is kívül van, nincs mit vágni. Különben: körnegyedekre (nyolcadokra) megismételjük a kör és él metszéspont-meghatározó eljárást, majd pásztázunk.
Sokszögek vágásánál sok esetet kell megvizsgálni. A SutherlandHodgman-algoritmus szerint sorba vesszük az éleket és egyenként vágunk.