6.5. Renderöintijärjestys Näkymän käsittelyjärjestyksiä on kahta tyyppiä. Ensimmäinen on monikulmioittainen käsittely, jossa kukin monikulmio prosessoidaan vuorollaan välittämättä muista. Toinen on selaussuorajärjestys, jossa annetun selaussuoran leikkaavat monikulmioiden janat käsitellään ennen siirtymistä seuraavalle selaussuoralle. Monikulmioittaisella käsittelyllä on etuja. Se on yksinkertainen toteuttaa ja tarvitsee vain vähän aktiivista dataa kerrallaan. Täten siinä ei ole näkymän monimutkaisuuden suhteen vastaan ylärajaa, kuten selaussuorakäsittelyssä. Heikkoutena siinä on, ettei se hyödynnä inormaation jakamista, varsinkaan sitä, että useimmat särmät liittyvät kahteen monikulmioon. Monikulmioittaista käsittelyä voidaan käyttää ainoastaan Z puskuriin perustuvan piilopintojen poiston yhteydessä, joka on muistia runsaasti vaativa menetelmä. Selaussuoramenetelmissä sitä paitsi luodaan koko kuva selaussuorajärjestyksessä, mikä on hyödyllistä laitteistototeutusten kannalta ja laskostumisen poistossa (anti aliasing). Menetelmien ero kuvastuu varsinkin niiden tavasta rakentaa särmälista. Edellä on tarkasteltu asiaa monikulmioittaisen käsittelyn kannalta. Selaussuoramenetelmällä tulisi sellaisella menettelyllä kaikkien monikulmioiden kaikkien särmien rasterointi etukäteen ongelmia tuhlaavan tilankäytön takia. Näin ollen tälle on mielekästä soveltaa aktiivisten särmien listaa, jossa on kerrallaan vain yhden selaussuoran särmät. 6. luku 349 6. luku 350 Selaussuoramenetelmän käsittelyn luonnos on: Monikulmioittaisen käsittelyn luonnos on: or jokaiselle monikulmiolle do muodosta lista monikulmioiden särmistä or y := ymin to ymax do or jokaiselle parille (x i,x i+1 ) särmien listassa[y] do sävytä vaakasuora jana pisteestä (x i,y) pisteeseen (x i+1,y) tyhjennä aktiivisten särmien lista or jokaiselle selaussuoralle do or jokaiselle nykyiseltä selaussuoralta lähtevälle särmälle do lisää särmä aktiivisten särmien listaan alusta sen sävytys ja rasteriarvot ja näiden lisäysarvot poista särmät, jotka eivät vaikuta enää selaussuoralla jäsennä aktiivisten lista käsiteltävien janojen saamiseksi lisää lisäysarvot kaikkiin aktiivisiin särmiin 6. luku 351 6. luku 352
6.6. Piilopintojen poisto On kaksi paljon käytettyä piilopintojen poiston lähestymistapaa, selaussuorapohjainen ja Z puskuripohjainen. Muita on olemassa, kuten alijako (pilkkominen), mutta niitä on edellisiä vähemmän sovellettu ja ovat pikemmin varattu erikoistarkoituksiin, esim. lentosimulaattoriohjelmiin. Z puskuri algoritmi Z puskuri algoritmi (Catmull, 1975) on hyvin keskeinen tietokonegraiikassa, aivan kuin Phongin heijastusmalli ja interpolointilaskenta. Monikulmion sisäiset pisteet sävytetään inkrementaalisesti ja niiden syvyysarvot lasketaan interpoloimalla monikulmion kärkien z arvojen perusteella katselumuunnoksen jälkeen. Syvyysarvot lasketaan luvun 1.5. yhtälöiden mukaisesti. Monikulmion pisteisiin (x s,y s ) on liitetty z arvot. Z puskuri algoritmi etsii ne läpi hakien minimin. Haku toteutetaan Z puskurin avulla, joka sisältää nykyisen pisteen (x,y) ja toistaiseksi löydetyn pienimmän z arvon. Monikulmioprosessin kuluessa pisteen (x,y) intensiteetti kirjoitetaan näyttöpuskuriin tai ei sen mukaan, onko nykyisen pisteen syvyysarvo z pienempi kuin tähän mennessä pienin, joka on talletettuna Z puskuriin. Merkittävä etu Z puskurin soveltamisessa on, että se on riippumaton kohteen esitysmuodosta. Vaikka sitä tässä kuvataan monikulmioverkkojen yhteydessä, se sopii myös esim. CSG kohteille. Menetelmän suurin etu on toteutuksen yksinkertaisuus. Sen suurin heikkous on Z puskuria varten tarvittavan muistin määrä. 6. luku 353 6. luku 354 Z puskurin koko riippuu tarkkuudesta, jolla kunkin pisteen (x,y) syvyysarvo tallennetaan (näkymän monimutkaisuuden unktio). Arvoa 20 32 ittiä pidetään tavallisesti riittävänä. Näkymä on skaalattava tähän z:n kiinnitettyyn väliin, jotta tarkkuus maksimoituu. Z puskuri ja kuvan osien koostaminen Z puskuri algoritmin hyöty on myös, että kuhunkin pikseliin liittyvä z arvo voidaan säilyttää ja käyttää erikseen luotujen näkymän osien koontiin tai lomittamiseen. Kolmiulotteiset kuvat muodostetaan monesti erillisistä alikuvista. Näitä voidaan yhdistää mm. Boolen operaattoreilla. Yksinkertainen erillisten alkioiden koostaminen perustuu pikselittäiseen käsittelyyn, jossa on RGB Z esitys alikuvan pikseleitä varten. Parametri mahdollistaa alikuvien erillisen rakentamisen ja yhdistämisen säilyttäen alipikseli inormaation, jota voidaan hyödyntää kunkin alikuvan käsittelyssä. Kaksi alikuvaa yhdistetään inäärioperaatiolla: = op Tarkastellaan esim. operaatiota Z min. Olkoot kaksi yksikohteista alikuvaa, jotka on renderöity erikseen. Jokaisen pikselin z arvot on käsitelty. 6. luku 355 6. luku 356
Tällöin koostaminen merkitsee piilopinnan poistoon vaikuttamista kohteiden välillä ja määritellään pikseleille: RGB Z = ( i Z = min( Z, Z < Z ) Parametri, 0 1, on pikselialueen osa, jonka kohde kattaa. Sitä käytetään tekijänä määräämään kahden kuvan värisekoitusta. then RGB else RGB ) Operaattori over määritellään: RGB α = α = RGB Tämä tarkoittaa, että kun RGB :tä on läsnä pikselissä. + (1 α + (1 α ) α vähenee, enemmän Koostamisoperaatio omp yhdistää em. operaatiot. Se laskee pikselien tulokset, kun Z arvot pikselien nurkissa ovat erilaiset arvojen RGB ja RGB välillä. Arvoa Z verrataan arvoon Z jokaisessa neljässä kulmassa. Näin on 16 eri mahdollisuutta. Särmiä pitkin interpoloidaan lineaarisesti. Lasketaan osa (pikselialue, jossa on lähempänä kuin ). Saadaan omp: ) RGB RGB = β ( over ) + (1 β )( over ) 6. luku 357 6. luku 358 Z puskuri ja renderöinti Z puskuri ei määrää rajoituksia tietokantaorganisoinnille (paitsi sävytysinterpoloinnin mielessä). Sen yksinkertaisin muoto on johdettavissa monikulmioittain, jolloin monikulmiot voidaan esittää halutussa järjestyksessä. Jokaiselle monikulmiolle voidaan laskea: (1) sisäpikselien (x,y) arvo (2) jokaisen pisteen (x,y) syvyysarvo z (3) jokaisen pisteen (x,y) intensiteetti I Näin algoritmiin tulee kolme rinnakkaista interpolointilaskentaa ja kolme sisäkkäistä silmukkaa. Intensiteetit I ja z arvot ovat käytettävissä kussakin kärjessä. Interpolointi niille tehdään kahdessa sisäsilmukassa. Z puskuria hyödyntävä piilopintojenpoistoalgoritmi on seuraava: or kaikille arvoille x, y do Z puskuri[x,y] := maksimisyvyys or jokaiselle monikulmiolle do tee monikulmion särmistä lista (jokaiselle särmälle lasketaan arvot x, z ja I kullekin selaussuoralle ja tallennetaan nämä särmälistaan) or y := y min to y max do or jokaiselle janalle särmälistassa[y] do hae X vasen, X oikea, Z vasen, Z oikea, I vasen, I oikea 6. luku 359 6. luku 360
or x := X vasen to X oikea do interpoloi lineaarisesti z ja I arvojen Z vasen ja Z oikea välillä sekä I vasen ja I oikea välillä i z < Z puskuri[x,y] then Z puskuri[x,y] := z näyttöpuskuri[x,y] := I Algoritmin tehottomuus sävytyksessä tulee lähinnä piilopikselien laskemisesta, jotka jätetään joko huomiotta tai myöhemmin uudelleenkirjoitetaan. Käytettäessä Phongin interpolointia heijastusmallilaskennan (interpoloidun normaalin unktio) tulee olla mukana sisimmässä silmukassa. Interpoloidaan normaalia N eikä intensiteettiä I, jolloin algoritmin viimeinen rivi kuuluu: näyttöpuskuri[x,y]:=sävytysunktio(n) Selaussuora Z puskuri On olemassa muunnelma Z puskuri algoritmista nimeltään selaussuora Z puskuri. Tämä käyttää ainoastaan yhden pikselin korkuista Z puskuria, johon talletetaan vain yksi selaussuora kerrallaan. Hyötynä on pieni muistin tarve, joten sitä käytetään muistiltaan rajoitetuissa ympäristöissä. Muitakin selaussuoramenetelmiä on ja myös muitakin Z puskurimenetelmiä, esim. Z pyramidi, mutta niihin ei puututa tässä. 6. luku 361 6. luku 362 Piilopintojen poiston jänteet Tässä algoritmi pyrkii löytämään jokaiselle selaussuoralle jänteet, joille sävytys voidaan suorittaa. Tehtävänä on jakaa selaussuora osiin, joille yksittäinen pinta on vallitseva. Tällöin sävytyslaskenta tehdään vain kerran kullekin pikselille, mikä poistaa Z puskurin tehottomuutta. Menettelyn heikkoutena on kuitenkin monimutkaisuus. Näin ollen Z puskurin käyttö on yleisempää kuvien jatkuvasti monimutkaistuessa. Ei puututa algoritmin yksityiskohtiin, mutta esitetään sitä valaisevat kuvat 6.23. ja 6.24. Kuva 6.23. Selaussuoratasoa siirretään alas näkymän läpi, jolloin saadaan janat ja jänteet. Kuva 6.24. Jänteiden käsittelyä. 6. luku 363 6. luku 364
BSP puut ja piilopintojen poisto Luvussa 2 esitettyjen BSP puiden hyödyntäminen rajoittui aluksi kauan lähinnä lentosimulaattoriohjelmiin. Kolmiulotteisten videopelien ja muun animoinnin nousun myötä BSP puut ovat pulpahtaneet esiin myös näkyvyyslaskennan yhteydessä. Alkuperäinen BSP puiden käyttö piilopintojen poistossa perustui staattiseen näkymään ja vaihtuvaan katselupisteeseen lentosimulaattoritai tietokonepelisovelluksessa. Ensivaiheessa näkymän BSP puu konstruoidaan (vain kerran), ja toisessa vaiheessa katselupistettä verrataan tähän rakenteeseen näkyvyyden määräämiseksi. Etuna on se, että huomattava osa näkyvyyslaskennasta voidaan tehdä esiprosessointina, mikä on tehokasta, ja täten tärkeää mm. reaaliaikaiselle tietokonegraiikalle. Kuvan käsittäessä konvekseja kohteita, jotka ovat erotettavissa tasoista muodostetuilla konvekseilla alueilla, rekursiivista hajota ja hallitse menettelyä voidaan soveltaa avaruuden jakamiseen. Oletetaan, että käytettävissä on sopiva menetelmä asettaa tasot ja puu on täydellinen, kun jokainen alue käsittää ainoastaan yhden kohteen. Kuva 6.25. esittää esimerkin. Jokainen lehtisolmu määrittää yhden kohteen, ja solmu vastaa erottavaa tasoa. Puun muodostamisen (kuva 6.25. (a)) jälkeen määrätään näkyvyysjärjestys katselupisteelle laskeutuen puuta juuresta käsin. Katselupistekoordinaattien avulla lasketaan sitä lähin kohde (kuva 6.25. ()). Juuresta laskeudutaan tason A puolelle alipuuhun tämän ollessa lähinnä katselupistettä. Tullaan tasolle B ja kohteelle 2. 6. luku 365 6. luku 366 Kuva 6.25. () esittää näkyvyysjärjestyksen reitin. Kohde 3 on seuraavaksi lähin. Tämän jälkeen mennään juuren kautta kohteeseen 1 ja lopuksi 4. Näin saatiin näkyvyysjärjestys lähimmästä kaukaisimpaan kohteeseen: 2, 3, 1 ja 4. Luonnollisesti se voitaisiin laskea myös käänteisessä järjestyksessä. Kuva 6.25. BSP operaatiot nelikohteiselle kuvalle. (a) BSP puun laatiminen. () Laskeutuminen puussa käyttäen katselupistekoordinaatteja antaa lähimmän kohteen. () Kaikkien kohteiden näkyvyysjärjestyksen laskenta. 6. luku 367 Käytännössä menettely ei ole erityisen hyödyllinen, sillä useimmiten sovelluksissa on kuvia, joissa kohteiden kompleksisuus (monikulmioiden määrä kohdetta kohti) on paljon suurempi kuin näkymän kompleksisuus (kohteiden määrä siinä), ja jotta menettely olisi hyödyllinen, pitää käsitellä kohteiden monikulmioita, ei niinkään kokonaisia kohteita. Lisäksi tasojen asettaminen on hankalaa. 6. luku 368
Monikulmioiden näkyvyyden järjestämiseksi valitaan tasot, jotka sisältävät etupuolen monikulmioita. Jokin monikulmio valitaan juurisolmuksi. Muut käydään läpi kyseisen monikulmion käsittävää tasoa vasten ja sijoitetaan sopivaan jälkeläishaaraan. Jokainen juuritason leikkaava monikulmio jaetaan kahteen osaan. Prosessi jatkuu rekursiivisesti, kunnes kaikki monikulmiot ovat tasolla. Näin syntyy enemmän monikulmioita, kuin oli alkuperäisessä näkymässä, mutta suhde on tavallisesti pienempi kuin 2. Kuvassa 6.26. on yksinkertainen esimerkki. Ensimmäinen valittu taso A sisältää monikulmion kohteesta 1 ja jakaa kohteen 3 kahtia. Puu rakentuu entiseen tapaan, ja määrätään sisälläulkona periaatteella, millä puolella jaossa kohde sijaitsee. Kuva 6.26. Monikulmioiden BSP puu. BSP puiden alkuperäinen toimintatapa oli kaukaalähelle järjestys. Monikulmioiden käsittely näyttöpuskuriin tässä järjestyksessä antaa nk. maalarin algoritmin, jossa läheiset pikselit kirjoitetaan kaukaisempien päälle. Myös läheltä kauasjärjestystä voidaan käyttää, mutta on merkittävä jollakin tavalla, milloin pikselissä on jo käyty. 6. luku 369 6. luku 370 Näkyvyysjärjestyksen kehittämiseksi tulee: Laskeutua pitkin puuta käyttäen pistekoordinaatteja. Määrätä jokaisessa solmussa, onko katselupiste solmutason edessä vai takana. Aluksi laskeutua pitkin alipuun kaukaista sivua ja tulostaa monikulmiot. Sitten laskeutua pitkin alipuun läheistä sivua ja tulostaa monikulmiot. Tämä antaa monikulmioiden takaa eteenjärjestyksen nykyisen katselukulman suhteen. Monikulmiot renderöidään näyttöpuskuriin kyseisessä järjestyksessä. Menettely kärsii samasta haitasta kuin Z puskuri, kun käsitellyt pikselit saatetaan välittömästi kirjoittaa päälle. 6. luku 371