Fotorealistisk 3D Datorgrafik Kensuke Sugii Åbo Akademi
Innehållsförteckning Innehållsförteckning 1 ABSTRAKT 3 1 INLEDNING 4 2 GEOMETRISKA HJÄLPMEDEL 5 2.1 Koordinatsystem 5 2.2 Vektorer 5 2.3 Matriser och matristransformationer 6 2.3.1 Matris rotation 7 2.3.2 Matris translation 7 2.3.3 Matris skalning (scaling) 8 2.4 Komplexa tal 8 2.4.1 Hyperkomplexa tal och kvaternioner 9 2.5 Polygoner 9 2.6 Constructive Solid Geometry 9 2.7 B-splines 10 2.8 Subdivision surfaces 12 3 BELYSNINGSMODELLER OCH SHADING 12 3.1 Lambert shading 14 3.2 Gouraud shading 14 3.3 Phong shading 15 3.4 Texture mapping 16 3.5 Bump mapping 16 3.6 Displacement mapping 16 4 RENDERING 17 4.1 Projektion, sampling och kvantifiering 17 4.2 Anti Alias 18 4.2.1 Bilinjär filtrering (Bilinear filtering) 19 4.2.2 Mip mapping 20 4.2.3 Trilinjär filtrering (Trilinear filtering) 20 1
4.2.4 Anisotropisk filtrering (Anisotropic filtering) 21 4.3 Skanlinje (Scan line) rendering 22 4.4 Raytracing 23 4.5 Radiosity 24 4.6 Caustic rendering och fotonavbildning (Photon mapping) 25 5 DISKUSSION 26 Litteraturförteckning: 27 2
ABSTRAKT Denna uppsats är ämnad att ge en överblick av metoder som används vid framställning av fotorealistisk 3D datorgrafik i dagens läge, samt gå igenom de mest grundläggande begrepp och matematiska hjälpmedel som används, i modellering av objekt, scensättning, belysning samt rendering. Vidare har metoderna jämförts med avsikten att förklara för och nackdelarna med dem i olika sammanhang, samt förknippats med hur vi upplever verkligheten visuellt. Tonvikten har lagts på att skapa en realistisk upplevelse, men kostnaden för beräkningarna med tanke på vad hårdvara har att erbjuda kommer också tas i beaktande. Optimering av algoritmerna är därför inte huvudsyftet med uppsatsen utan snarare har metoderna jämförts med tanke på hur bra optimeringar har gjorts. Nyckelord: Modellering, Scensättning, Material, Refraktion, Reflektion, Färglära, Luminans, Shading, Raytrasing, Radiosity, HDR, Caustics, Photonmapping, Texture mapping, Anti- Aliasing, Mip mapping, Trilinear filtering, Rasterisering, Gamma korrigering, B-Splines, NURBS, CSG, Bumpmapping. 3
1 Inledning Grafik härstammar från det greksika ordet graphikos, att rita eller skriva skrapa på lertavlor. Idag använder vi ordet I betydelsen, visuella presentationer, I något givet medium, som t.ex. på papper, tavlor, film eller dator skärmar. När vi talar om grafik menar vi knappast något annat än tvådimensionella representationer, medan tredimensionella föremål går utöver definitionen. Men vi kan fortfarande representera tredimensionella föremål I två dimensioner genom nån typ av projektion. Med 3D grafik menas just sådan grafik, som projicerats i ett plan. Sådan grafik som genereras på dator kallar vi 3D Datorgrafik och är realistisk i den grad vi inte kan urskilja den från verkligheten, dvs. är naturtrogen. Nu är målet med utvecklingen av 3D datorgrafik att åstadkomma den typ av realism, men också samtidigt att göra det så effektivt som möjligt. Det senare kravet är ytterst viktigt när det gäller grafik som måste genereras i realtid alltså i sammanhanget att generera interaktiva animationer, som t.ex. datorspel, men också i icke-realtidssammanhang så kan tid vara en bristvara. Datorgrafiken är oftast inte fullt så realistisk att vi inte skulle kunna urskilja från verkligheten, men många framsteg har gjorts och bilderna och animationerna genererade på dator idag ser mycket mer verklighetstrogna än vad de gjorde för exempelvis tio år sedan. I den här uppsatsen kommer jag att lägga tonvikten vid kravet på realism snarare än optimering, men kommer också att beröra det senare i vissa sammanhang. Jag kommer därför att gå igenom de metoder och koncept som är aktuella, för att åstadkomma en överblick av 3D datorgrafik I dagens läge som koncentrerar sig på naturtrogenehet. Processen i produktionen av 3D datorgrafik kan delas upp i 3 delar, nämligen modelleringen av objekt, scensättning och rendering dvs. generering av den slutgiltiga bilden. Modellering av objekt sker mha. olika typer av geometriska hjälpmedel som jag tar upp i andra kapitlet. I det tredje kapitlet tar jag upp skuggning och belysningsmodeller som används för att åstadkomma de rätta ljuseffekterna för scen. I kapitel fyra så går jag igenom några renderingsalgoritmer och avslutar med en diskussion i det sista kapitlet. De flesta engelska tekniska termer som används här har ingen adekvat standardiserad svensk term, så därför har jag beslutat att använda den engelska termen och förklara vad det innebär första gången. De flesta bilder är tagna från nätet, i vilket fall det finns referenser angivna, men vissa bilder har jag själv ritat. 4
2 Geometriska hjälpmedel I det första steget gäller det att skapa en 3-dimensionell matematisk modell av de föremål man vill avbilda. Då finns det flera olika sätt att representera dessa objekt på, men i allmänhet krävs det att man har ett koordinatsystem som fungerar som en referensram till vilket allt är ursprungligen är relaterat. 2.1 Koordinatsystem Alla geometriska föremål som har läge är relaterade till varandra i ett så kallat kordinatsystem. Alternativt skulle objekt kunna beskrivas direkt i relation till varandra, men en sådan strategi är inte bara extremt ineffektiv utan förlorar också begrepp om perspektiv och förankring till vår rumsintuition. Istället så anger vi varje föremål i koordinater, för att bespara oss sådana problem. Koordinatsystem kan vara antingen högerhänta eller vänsterhänta, vilket bestäms av i vilken riktning y axeln har i relation till x och z axlarna. Om vi sätter tummen i x axelns led och långfingret i z axelns led så ska y axeln vara i pekfingrets led. Om det stämmer överrens med höger hand så är det högerhänt, annars vänsterhänt. I ett kartesiskt koordinatsystem anger man koordinaterna som komponenter i enhetsvektorernas riktning medan i ett polärt koordinatsystem anger man koordinater med vinklar och en radie. Ibland vill man uttrycka vissa rumsfenomen i lokala koordinater, dvs relativt en viss orientering i ett annat systemet och då använder man sig av ett lokalt koordinat system. Det ursprungliga systemet kallar man då för globalt koordinatsystem. När vi väl har koordinatsystemet på plats, så kan vi införa objekt som är i allmänhet angivna med hjälp av vektorer. 2.2 Vektorer Vektorer är en av de mest fundamentala begrepp inom 3D datorgrafik, för form och storlek på alla objekt kan beskrivas med vektorer. En vektor är en riktad endimensionell storhet, och kan antigen beskrivas av dess orientering och längd, eller som en n-tippel av dess utsträckning i varje dimension i det givna koordinatsystemet. Det tidigare sättet kallas polär medan det senare kartesisk, men eftersom den kartesiska representationen är den som används nästan uteslutande i detta sammanhang, så kommer jag endast att ta upp den. Med hjälp av de olika operationer som är definierade i vektoralgebran, kan man beräkna viktiga geometriska och dynamiska egeneskaper för objekt i en scen. För vektorer har de vanliga aritmetiska operatorerna har en speciell dynamisk funktion. Att addera och subtrahera betyder samma sak som att förflytta, medan att multiplicera 5
och dividera med en skalär betyder att ändra på storleken i omvänd proportion till skalären. Produkter mellan vektorer finns det två typer av. Den skalära produkten som ger en skalär, som är längden av den ena multiplicerat med längden av den andra projicerad på den förra. Skalär produktion används oftast för att framställa projektioner och för att eliminera användande av trigonometriska funktioner för att bestämma förhållandet mellan två vinklade plan. Vektor produkten som namnet redan antyder, består av en vektor. Dess riktning är vinkelrät mot dess operander och har en storlek som är arean av det område dessa spänner upp. Den används ofta för att bestämma normaler och orienteringen på asymmetriska objekt. Vektorer kan också användas för att ange hur objekt är lokaliserade i förhållande till ett koordinatsystem, men för att få en mera dynamisk kontroll över detta så används matriser. 2.3 Matriser och matristransformationer Matriser är ett hjälpmedel för att lösa linjära ekvationssystem, men också hjälpmedel för att representera hur objekt är orienterade i förhållande till varandra, eller till ett koordinatsystem. De består av räckor med tvådimensionella räckor varpå vi har definierat olika operationer, varav vi är intresserade av just två typer av produkter vi vill använda för att dynamiskt kunna manipulera objekts orienteringar, något vi kallar för att göra matristransformationer. Matris multiplikationen är en produkt mellan matriser som ger en sekventiell representation av operandernas transformationer. En människokropps olika delar är sammankopplade i olika rörliga leder, men om man vrider på en led så vrids alla delar omkring den leden, som tex. när man vrider på fingerlederna. När vi vrider på flera leder så får vi en sekventiell effekt. En vridning kan representeras med en matris, medan en sekventiell vridning av flera leder kan representeras med en matris multiplikation. Matris multiplikationen är av samma skäl inte kommutativ, eftersom om man gör de olika vridningarna i olika ordning får vi olika resultat. Det här har att göra med med specifika egenskaper av den geometriska rymden. Den andra produkten är matris-vektor produkten som består av en vektor som vi i det här sammanhanget representerar resultatet av en utförd transformation på något föremål som beskrivs av vektor operanden. Det finns tre typer av grundläggande operationer varur man kan komponera mera komplexa rörelser, nämligen translering, rotation och skalning. Att translera betyder att flytta, och att skala är att ändra på storleken. Matriser är väldigt behändiga eftersom komplicerade rörelser kan sammanfattas med en enda matris, och det följd av matrisprodukter på dess delsteg. Matriser används för animera objekt och kameror i scenen, men är också nyttiga för stillbilds generering om man vill återanvända matematiska modeller i andra sammanhang. 6
2.3.1 Matris rotation Rotation utförs genom att multiplicera med en så kallad rotationsmatris. Två typer av rotationsmatriser används, med olika dimensioner, 3 x 3 matriser och 4 x 4 matriser. De mindre matriserna är endast användbara om vi inte utför andra operationer än rotationer. Om vi ska rotera runt en given punkt annat än origo, så krävs translationer för att flytta den punkten till origo före rotationen och tillbaka efter rotationen, men det här måste man alltid göra med homogena koordinater, dvs. med en extra dimension som är en faktor i de andra. Beroende på vilken axel vi roterar runt, så har vi 3 matriser: 1 0 0 0 cos_ 0 sin_ 0 cos_ -sin_ 0 0 0 Cos_ -sin_ 0 0 Sin_ cos_ 0 0 0 0 1 0 1 0 0 sin_ cos_ 0 0 -sin_ 0 cos_ 0 0 0 1 0 0 0 0 1 0 0 0 1 X Rotation Y Rotation Z Rotation Om vi kombinerar dem får vi en enda matris, men här gäller det att alltid utföra kombinationen på samma sätt. Här är ett exempel: Cos_ cos_ Cos_ sin_ sin_-cos_ sin_ Cos_ cos_ sin_ +sin_ sin_ 0 Cos_ sin_ Cos_ cos_+sin_ sin_ sin_ -cos_ sin_ + cos_ sin_ sin_ 0 -sin_ cos_ sin_ cos_ cos_ 0 0 0 0 1 Rx Ry Rz Att rotera runt en godtycklig axel är också möjligt men involverar komplicerade uttryck och då är det bättre att vi använder något mera lämpligare hjälpmedel som tex. kvaternioner som jag kommer att ta upp senare. 2.3.2 Matris translation Translation kan förstås som en förflyttning i något håll. Då multiplicerar vi med en translationsmatris som ser ut på följande sätt: 1 0 0 Tx 7
0 1 0 Ty 0 0 1 Tz 0 0 0 1 Tx, Ty och Tz är de relativa koordinaterna för förflyttningen. 2.3.3 Matris skalning (scaling) Skalning är att förstora eller förminska något med avseende på origo. På samma sätt som vid rotation måste man utföra translation för att göra det med avseende på en godtycklig punkt. Skalningsmatrisen ser ut på följande sätt: Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1 Sx, Sy och Sz är skalningskoefficienterna för komponenterna i enhetsvektorernas riktning. Då de inte är lika, så blir föremålet utsträckt eller alternativt tillplattat. För att göra det i godtycklig riktning, så kan man utföra en rotation först, och en efter i motsats riktning. 2.4 Komplexa tal Vektorer och matriser lämpar sig bra för att hantera kartesiska representationer, men i vissa fall kan det vara skäl att använda sig av polära representationer, mestadels för att hantera komplexa rotationer. Då kan ett enklare matematiskt begrepp användas, nämligen komplexa tal. Komplexa tal är en utvidgning av reella tal för att ge lösningar åt ekvationer av typen x 2 =-2, dvs. då vi får ett negativt tal under en rot av jämn grad. Komplexa tal skriver vi antingen som ett talpar: a+bi, där i=roten ur -1, a är den reella komponenten och b den imaginära komponenten, eller som re iϕ där ϕ är vinkeln mellan vektorerna (1,0) och (a,b). Vi kan framställa komplexa tal visuellt i två dimensioner som en vektorer (a,b), varvid vi kan föreställa oss hur de olika operationerna kan förstås. Addition och subtraktion sker på samma sätt som med vektorer, men multiplikation och division, sker rotation och skalning med avseende på punkten (0,0). I motsats till vektorer har komplexa tal alltså operationer för både polär och kartesisk framställning och gynnar därför inte bara en kartesisk representation. 8
2.4.1 Hyperkomplexa tal och kvaternioner Hyperkomplexa tal är en generalisering av komplexa tal, men inte för n utan för n 2 dimensioner. Kvaternioner är alltså en fyrtippel av tal och kan presenteras visuellt i fyra dimensioner. I många fall är upprepade rotationer ineffektiva att göra med matriser, och orsakar dessutom ett fenomen som kallas gimbal låsning, och då kan kvaternioner vara ett bättre hjälpmedel. Om vi roterar koordinataxlarna X och Y 90 grader successivt, så kommer rotering av Z axeln att sammanfalla med X axeln, vilket är alltså gimbal låsning. I flygplanssimulatorer måste man kunna klara av att svänga fritt kring planets egen axel, men det här klarar inte vanliga transformationer med Euler vinklar av. Därför används kvaternioner som tillåter oss att rotera kring en arbiträr axel, vilket sker genom multiplikation med en annan kvaternion. För att utföra successiva rotationer så multiplicerar vi med kvaternioner i serie. 2.5 Polygoner Nu har vi behandlat de viktigaste hjälpmedel att representera föremåls dynamiska egenskaper och kan fortgå till själva konstruktionen av modellerna. Polygoner är den vanligaste typen av geometriska objekt som används för att modellera en scen. En polygon består av en plan yta insluten av minst 3 stäckor. Eftersom alla polygoner kan delas upp i trianglar, så är ofta trianglar fördelaktiga att använda eftersom det förenklar renderingsproceduren. Trots det kan också polygoner av högre grad vara användbara och ha sina fördelar. En polygons konvexitet har också stor betydelse för renderings processen, eftersom den regelbundenhet konvexitet innebär att en massa förenklingar kan göras. En polygon är konvex om och endast om varje sträcka som man ritar i polygonen är helt innesluten i polygonen. Ett tvärsnitt kommer därför aldrig att dela upp dem i mer än två mindre polygoner. Det här garanter t.ex. att om man kapar av hörn som sticker ut ur skärmen så kommer återstoden alltid att vara en enda polygon och den kommer också att vara konvex, vilket underlättar dess konversion till skanlinjer, eftersom två skanlinjer inte kan finnas på samma rad (eller alternativt kolumn.) 2.6 Constructive Solid Geometry En mera sofistikerad metod som kallas Constructive solid geometry eller CSG behandlar olika volymobjekt algebraiskt som mängder med punkter. Att presentera dem som mängder med punkter vore otympligt, så snarare görs det med begränsande ytor. Skulle man få se ett tvärsnitt av en sfär, så skulle dess inre döljas av en cirkulär yta, för att ge intrycket av att vara solid och inte ihåligt. Med konstruktiv solid geometri så bygger man 9
upp komplexa objekt ur mera primitiva objekt med hjälp av booleska operationer som snitt, union och differens [5][7]. Enklast görs detta genom att man undersöker hur objekten skär varandra och delar upp vardera objekten i sin fristående del och sin sammanfallande del. Vid union eliminerar man de sammanfallande delarna, vid snitt eliminerar man de ickesammanfallande delarna, och inverterar ytorna ifall de är riktade. Vid differens eliminerar man subtrahendens fristående del och minuendens sammanfallande del, samt inverterar ytorna i subtrahendens sammanfallande del ifall de är riktade. I figuren nedan ser vi resultatet av fyra olika booleska operationer, uppifrån ner: union, snitt, A-B och B-A där A är klotet och B är konen. Figur 1. Constructive Solid Geometry Källa: <http://www.cs.uwaterloo.ca/~blucier/cs488/blucier.html> 2.7 B-splines Kurvor brukar uttryckas med hjälp av parametriska funktioner. Parametriska funktioner är av typen [0,1] -> R n, som kan föreställas som en punkt som rör sig från tidpunkt 0 till 1, i en n-dimensionell rymd. Speciellt användbara parametriska funktioner är splines, som är lätta att styra och få att se ut som man vill. Splines är polynom eller bitvis definerade av polynom. Ett polynom är en summa av olika potenser multiplicerade med koefficienter, alltså _ i=0 A i x i.de splines jag kommer att ta upp är Bezier kurvor, B-splines och NURBS [7]. Den enklaste typen Bezier kurvor, är en typ av polynom som 10
konstrueras mha. en mängd kontrollpunkter P som kurvan följer. Koefficienten A i blir då en produkt av P i och antalet kombinationer av i bland n utan hänsyn till ordning, alltså n!/(i!(n-i)!), och själva polynomet är _ i=0 A i x i (1-x) n-i [1][5]. Kvadratiska eller kubiska polynom används vanligen, men högre grads polynom blir kostsamma att beräkna, och därför använder man sig av Bezier splines istället som pusslas ihop av flera lägre ordningens bezier kurvor, men för att få kurvan att se kontinuerlig ut måste riktningen där den ena slutar och den andra börjar vara lika, och då sätter man den nästsista kontrollpunkten i den föregående och den nästförsta i den följande kurvan i rak linje. Att se till att att kurvan hålls kontinuerlig kan vara ganska jobbigt i längden, och svaret på det är B-Spline kurvor är en generalisering av Bezier kurvor som också är konstruerade mha. sådana kontrollpunkter, men ytterligare av en knot vektor [7] som bestämmer hur kurvan ska uppdelas. Det görs enkelt med att dela upp själva domänen, alltså själva parametern från 0 till 1, och om vi ordnar de här värdena som vi kallar för knotvärden så får vi en knotvektor, och punkterna i kurvan som delar upp den kallas för knoter. B-spline funktionen är alltså kontinuerlig men vi kan också snabbt ändra på uppdelningen till bezier kurvor, vilket vi inte kan göra med bezier splines. Bezier kurvan är ett specialfall av B-splines, nämligen då kurvans ordning sammanfaller med antalet kontrollpunkter-1. NURBS som står för Non Uniform Rational B-Spline är en generalisering av B-splines. För att förstå vad de är måste vi gå tillbaka till B-splines och undersöka distributionen av knoter. Om de är på jämnt avstånd från varandra så kallar vi dem för uniforma B-splines, i annat fall har vi något relativt tätare med knoter på en del av kurvan och då kallas den för icke uniform, vilket Non Uniform i NURBS står för. Rational står för att de kan uttryckas i form av en kvot (ratio) av polynom, och i motsats till vanliga polynom, kan vi med sådana uttrycka sådana kurvor som cirklar och ellipser. Kontrollpunkterna i NURBS är homogena koordinater, vilket betyder att en 3D NURBS kurva faktiskt är en projektion av en 4D B-spline. Det här förstår vi med att tänka på NURBS som en kvot av polynom. Den extra dimensionen använder vi för att sätta vikter på kontrollpunkter så att kurvan kan töjas ut och in, ungefär som om man skulle hänga vikter på en metallremsa för att få den att böjas olika mycket. NURBS hålls också konstanta under perspektivtransformation, vilket underlättar renderingen. NURBS, B-spline och Bezier kurvor kan vidare generaliseras till ytor, och då har vi två parametrar i stället för en, och ett matris av kontrollpunkter istället för en vektor. NURBS har varit en dominant metod men har på senaste tiden ersatts, dock inte helt av en mycket flexiblare metod som kallas subdivision surfaces, som bygger vidare på användningen av polygonbaserade modeller. 11
2.8 Subdivision surfaces Subdivision surfaces går ut på att man jobbar med en relativt enkel modell och sedan spjälker upp dess polygoner i mindre polygoner för att jämna ut hörn och kanter. Catmull-Clark är en sådan metod. Den går ut på att man sätter in nya punkter i mitten av varje polygon och i mitten av mitten av varje kant samt de nya punkterna i de avgränsade polygonerna. De gamla punkterna flyttas enligt ekvationen (Q + 2R + S(n-3))/n där Q är medelvärdet av de nya punkterna i de avgränsande polygonerna, R är medelvärdet på mittpunkterna på de utgående kanterna, S är original punkten samt n är antalet utgående kanter. Resultatet blir en rundad form av den enkla modellen, som man kan finjustera på olika nivåer som man kört metoden på rekursivt. Andra metoder är Loop, Doo-Sabin, Kobbelt och Butterfly. I jämförelse med NURBS har man mera kontroll över strukturen i helhet, men nackdelen är förståss att det krävs ganska mycket resurser att hantera alla finfördelade ytor. Därför brukar subdivision surfaces endast köras vid renderingen för att inte slösa resurser när man koordinerar en scen. Vid själva scensättningen är man mera intresserad av hur ljus och skuggspel som får scenenen att verka realistisk. Det behandlar vi i följande kapitel. 3 Belysningsmodeller och shading Näthinnan består av synceller som tar emot information i form av ljus och konverterar den till elektriska impulser som skickas vidare till hjärnans syncentrum [5]. Det finns två huvudtyper av synceller som kallas för tappar och stavar. Det finns tre typer av tappar, som är känsliga för olika frekvenser av ljus, närmare bestämt grönt, blått och rött. Stavarna är mycket känsligare för ljus men uppfattar inte färger, vilket är orsaken till varför vi inte ser färger så bra i halvmörker. De olika färger som vi ser är alltså kombinationer av dessa tre. I och för sig finns det flera färgmodeller där tre grundfärger kombineras för att skapa de andra, men den färgmodell som används mest i datorsammanhang är RGB-modellen som har grund färgerna röd grön och blå, och detta beror på att bildpunkterna på skärmen är röda, gröna och blåa. Det här kan man se med blotta ögat om man ser på bildskärmen på några centimeters avstånd. RGB modellen är additiv, dvs. färger blandas på samma sätt som vi blandar ljus, och i motsats till då vi blandar färgpigment, så blir ljuset starkare istället för svagare. Då vi blandar Rött grönt och blått i full intensitet får vi vitt, medan då vi blandar dem i lägsta intensitet får vi svart. I dagens läge klarar de flesta bildskärmar av 16777216 färger, en siffra vi får av kombinationer av 256 olika luminansnivåer per grundfärg, alltså tredje potensen av 256. Varje punkt sparas således i 24 bitar, en siffra som vi får av att ta andra logaritmen av 16777216, dvs 8 bitar, eller en byte per grundfärg. 12
Andra ljusmodeller används också, speciellt i sammanhanget datorgrafik, eftersom RGBmodellen inte är speciellt intuitiv. HSL eller HSB modellen, som står för Hue-Saturation- Luminance eller Brightness är en mer intuitivare modell, eftersom den spjälker upp ljuset i komponenterna Luminance, alltså ljus styrka, Hue, alltså dominant våglängd eller nyans och Saturation, alltså färgmättnad eller spridning. Den här modellen får vi ur RGBmodellen om vi sätter luminans axeln i diagonalen på kuben som spänns upp av Röd, Grön och Blå koordinataxlarna [5][3]. I normalplanet till luminansen får vi dominant våglängd och mättnad som polära koordinater, alltså nyans som vinkel och färgmättnad som radie. Jag kommer endast att behandla luminansen i sammanhanget med belysningsmodeller, och för att ta i beaktande färger så tar vi antigen och beräknar luminansnivån för varje färgkomponent skilt och kombinerar dem sedan, eller så multiplicerar vi luminansen med färgfaktorn. Vid scensättningen har placeringen av belysning och val av typ av belysning ofta stor betydelse. Ljus och skuggfenomen är speciellt viktiga för att skapa ett realistiskt intryck. Vanligen delar vi in ljuskällor i tre huvudtyper: Ambient, Diffuse och Specular[5]. Ambient ljus finns närvarande överallt och är så pass utspritt att det inte har någon speciell riktning. Utan Ambient ljus skulle ytor som ligger i skugga vara totalt förmörkade. Diffust ljus är ljus som har en riktning, men inget ursprung, dvs. dess strålar är parallella. Solljus kan approximeras med diffust ljus eftersom solen ligger så pass långt borta att det inkommande ljuset är så gott som parallellt och det förenklar beräkningarna. Specular highlights får vi med ljus med givna källor, för det mesta punktformiga. Då beror riktningen på det inkommande ljuset på rumsförhållandet mellan ljuskällan och ytan. Några andra ljuskällor som används är strålkastare (spotlights) som har ett givet avfall, oftast exponentiellt, från den riktning strålkastaren är riktad mot, samt glödande ytor som avger ljus. Skuggor som orsakas av ljus som har utsträckning blir suddiga, eftersom ytan blir bara till en del skuggad av ljuset. Den belysta ytans material har också stor betydelse, eftersom olika material reagerar olika på ljus. Blanka ytor reflekterar högdagar bra medan matta ytor gör det inte, så därför är de tidigare förknippade med specular och det det senare med diffust ljus. Mikroskopiska skrovligheter i matta ytor får ljuset att spridas i alla riktningar. En idealisk diffus yta reflekterar ljuset lika mycket i alla riktningar, och den här modellen används just för diffust ljus. Högdagar å andra sidan reflekteras bara i spegelvänd riktning i förhållande till ytnormalen. För ytmaterialet kan man alltså specifiera en koefficient för andelen diffust ljus och högdagar skilt. Vidare så kan man specifiera en omgivande färg som anger vilken färg ytan har ursprungligen, och skulle ha i skugga av samtliga ljuskällor. Materialet kan också vara genomskinligt, helt eller dels, och därför få en andel ljus att brytas i materialet. Enligt brytningslagen så beror ljusets brytning på 13
densitetskilnader mellan materialet och omgivningen. För enkelhetens skull så anger vi ett brytningsindex för materialen och beräknar att kvoten mellan cosinus av vinklarna till ytnormalen är lika med kvoten av indexen. Då det är frågan om glödande ytor så tillskriver vi ytan en emmittansfaktor. 3.1 Lambert shading Lambert shading, också kallad flat shading är den enklaste av de skuggningsmodeller som jag kommer att ta upp. För en given yta räknas mängden diffust ljus som träffar ytan. Diffust ljus som träffar en yta sprids lika i alla riktningar, men eftersom diffust ljus har en riktning så kommer mindre ljus att träffa ytan i brantare vinkel. Enligt Lambert s cosinus lag [5] så är mängden ljus proportionell mot cosinus av vinkeln mellan ljuset och ytnormalen. Om vi normaliserar ytnormalen och vektorn mot ljuset behöver vi inte göra en krävande cosinus kalkyl utan kommer undan med att räkna punktprodukten av dem. Högdagar ska synas bäst i en vinkel spegelvänt från det inkommande ljuset, och vektorn för det utgående ljusstrålen får vi genom formeln i figuren nedan. Om man nu tänker säg att ytan inte är helt blank så kommer ljuset att falla av om vi avviker från den vinkeln, och avfallet brukar man beräkna att vara en exponentialfunktion av den vinkeln. Figur 2. Specular reflection 3.2 Gouraud shading Lambert shading en bra början, men ser artificiell och kantig ut. Gouraud [5][2] är en utveckling av Lamberts modell, som ger varje pixel en egen färg, en så kallad per pixel shader. För att utjämna kantigheten så interpolerar Gouraud shading färgerna linjärt mellan kanterna. Färgen på varje punkt på kanten är i sig linjärt interpolerade mellan hörnen och färgen på hörnen beräknas likadant som i Lamberts modell med en normal som är medelvärdet av alla avgränsande ytors normaler. I figuren nedan så har jag till vänster illustrerat ytornas normaler med svart och medelvärdet av dem som varje hörn 14
har med rött. För att finna färgen på punkt q och r i figuren i mitten, då vi räknat ut färgerna för punkt p1, p2 och p3, så räknar vi kvoten d=(q-p1)/(p2-p1), och får färg(q)=färg(p1)d+färg(p2)(1-d) och analogt för r [2]. Figur 3. Från vänster, Ytnormaler och deras medelvärden, Linjär interpolering samt jämförelse mellan Gouraud och Lambert shading. 3.3 Phong shading Liksom Gouraud shading bygger Phong [5][2] shading på interpolering men istället för att interpolera färgerna så interpolerar Phong shading normalerna direkt. Därför kallas också Phong och Gouraud för vektor respektive skalär interpolerings tekniker. I o för sig är inte en färg en skalär utan representeras av en vektor med 3 färg komponenter, men man kan tänka sig att färgkomponenterna interpoleras skilt. Problemet med Gouraud shading är att specular highlights, alltså högdagar i blanka krökta ytor, ofta representeras dåligt eller försvinner fullständigt. Det här beror på att blänket befinner sig i mitten regionen av ytan och färgerna som fås fram ur noderna ligger utanför det varför de interpolerade värdena inte innehåller nåt blänk. Även om blänket finns med i nån eller några av noderna så kan det få helt fel form i det interpolerade resultatet. I allmänhet brukar det inte synas så bra. Phong är en bra lösning på problemet eftersom de interpolerade normalerna inkluderar just de vinklar där blänket är som starkast, samt alla vinklar som faller av från den optimala vinkeln. Phong shading är naturligtvis inte heller perfekt. Skiftar perspektivet mycket så kommer phong skuggningen att presentera förändringar för snabbt i delar som ligger närmare kameran medan i delar som är längre bort sker de för långsamt. Det här beror på att interpoleringen är linjär och sker mellan bildpunkter och inte punkter i 3D rymd. Det går förståss att åtgärda så att man interpolerar de kordinaterna i 3D rymd. Phong shading är i allmänhet mycket mera kostsam än Gouraud men ger mycket bättre resultat. Ibland använder man fusk Phong shading som är en approximation för att få relativt bra resultat med betydligt mindre kostnad. I figuren jämförs Lambert, Gouraud och Phong shading. I Gouraud versionen så ser vi tydligt effekten av att interpolera färgerna, nämligen kantiga linjer ramar in blänket och ser onormalt ut, medan Phong versionen verkligen ser runt ut. 15
Figur 4. Jämförelse, från vänster, Lambert shading, Gouraud shading och Phong shading. 3.4 Texture mapping I många fall vill man inte ha en uniform färg för hela objektet utan vill klä det i en textur, alltså en bild som man täcker det med i ett tapetmönster. Då det är fråga om polygoner så brukar man avbilda texturkordinater på dess hörn, i ett så kallat UV-koordinatsystem. Texture mapping kan också göras på parametriska ytor som NURBS [5][3][9]. 3.5 Bump mapping Bump mapping är en metod som man använder för att få en yta som annars skulle vara flat att verka ojämn. Ojämnheterna kan man kartlägga genom att använda en bitkarta för att representera höjdskilnader i materialet [9]. Ofta gör man det här parallellt med texture mapping så att ojämnheterna sammanfaller med detaljer i texturen. Ur bitkartan får vi vidare fram ytnormalerna för varje punkt som partialderivator. Partialderivatorna sparar vi i den slutliga bitkartan och glömmer höjdskilnaderna vid renderingen. Bump mapping kan man använda i samband med en skuggningsmodell så att man roterar normalerna man får i skuggningsmodellen med normalerna för bump mapping. 3.6 Displacement mapping Ett problem med bump mapping är att objektet inte får någon bucklig siluett. Det här klarar däremot displacement mapping av som inte bara modifierar normalerna utan själva ytan [9]. Det här förutsätter däremot att ytan är så pass finfördelad i polygoner att detaljerna syns om vi kan flyttar på hörnena i riktning av medelvärdet av de avgränsande ytornas normaler, i proportion till motsvarande värde i bitkartan som anger höjdskilnaderna. Att spjälka upp objekten i tillräckligt många polygoner är tyvärr ofta är ett ganska högt krav på resurser, jämfört med bump mapping. 16
Figur 5. Bump mapping TV. och Displacement mapping TH. Källa: <http://atec.utdallas.edu/midori/handouts/texture_mapping.htm> 4 Rendering 4.1 Projektion, sampling och kvantifiering Efter att modelleringen och scensättningen är det bara att rendera. Rendering innebär att vi projicerar en 3D modell i ett plan, men det innebär också att vi måste kvantifiera och sampla, dvs. avbilda en kontinuerlig modell till en diskret. Projektionen kan vi enkelt åstadkomma med en projektionsmatris, men för att förstå den så ska vi undersöka det enkla fallet hur en punkt projiceras på en axel i projektionsplanet. Figur 6. Projicerad punkt. I figuren så ser vi att trianglarna som vi får av sträckorna till den projicerade och den tredimensionella punkten samt deras komponenter I Y och Z axeln är likformiga. Det här betyder att Y/Z = Y /Z alltså är Y=Y Z/Z. På samma sätt får vi att X=X Z/Z då vi byter ut Y axeln mot X axeln. I homogena koordinater blir transformationen att se ut på följande sätt: 17
där f är focuslängden alltså Z i figuren. Multiplicerar vi in homogena 3D koordinaten så borde vi få den homogena 2D koordinaten (-Xf, -Yf, Z) vilket är samma som (-Xf/Z, - Yf/Z,1) vilket är det vi ville ha. Men så här enkelt är det inte riktigt. De projicerade punkterna blir rationella tal om vi jobbar med heltal och reella om vi jobbar med flyttal, som man brukar representera reella tal med på datorer. Nu så har vi begränsad mängd minne att lagra bildpunkter i så vi kan inte rendera punkterna var som helst utan med jämna mellanrum i en matris av bildpunkter med given upplösning. Det här betyder att de projicerade punkterna kommer troligtvis inte att sammanfalla med punkterna i matrisen, utan vi måste avbilda punkter från en kontinuerlig domän till en diskret, dvs. kvantifiera. Då vi projicerar objekt med utsträckning så blir vi på samma sätt tvugna att avbilda en kontinuerlig funktion på en diskret, dvs. sampla. Sampling går ut på att man tar stickprov med jämna mellanrum ur en kontinuerlig signal, och erhåller en diskret signal. Vid samplingen kan ett problem uppstå som kallas alias. 4.2 Anti Alias Enligt Nyquists samplingsteorem [3] så innehåller ideala samplingen av en kontinuerlig funktion all information i den kontinuerliga funktionen om och endast om den kontinuerliga funktionen är samplad i en frekvens större än två gånger den högsta frekvensen i funktionen, den så kallade Nyquist frekvensen. Det här betyder att små detaljer tillräckligt långt borta kommer att försvinna i horisonten och inte synas i sampeln. Om frekvensen i signalen är större än Nyquist frekvensen så orsakas alias i sampeln, dvs. uppstår en falsk signal, i form av ett moire mönster. Att motverka sådana fenomen kallas för anti alias. Det här något som man oftast förknippar med att få kanter på bokstäver, linjer och andra figurer att se mindre kantiga ut, men problemet är det samma. Samplingen är tillräckligt grov och detaljerna på den fina kurvan eller bokstaven kommer inte med utan tvärtom får resultatet att se onaturligt ut. Moire mönster är speciellt tydliga och störande när det handlar om tvådimensionella samplingar och kan ibland tom. ändra färgen på resultatet. Det finns olika lösningar på problemet. De lösningar jag kommer att ta upp är bilinjär filtrering, mipmapping, trilinjär filtrering och anisotropisk filtrering. I diagrammet nedanför, så presenteras ett typiskt alias fenomen, 18
fast här i en dimension. Samplena som är tagna med ett regelbundet avstånd är lägre än Nyquist frekvensen och hamnar på en kurva som inte alls fanns i originalet. Figur 7. Från vänster, Ytnormaler och deras medelvärden, Linjär interpolering samt jämförelse 4.2.1 Bilinjär filtrering (Bilinear filtering) Bilinjär filtrering är en metod som används i sammahang med texture mapping. Den går ut på att ge varje pixel (den samplade bildpunkten) det vägda medeltalet av de fyra närmaste texlar (textur bildpunkter, texels på engelska) [4]. Det här fungerar bra om texlarna är större än pixlarna och motverkar aliasen mellan texlarna. Vikten per texel avgörs med linjär interpolering, på samma sätt som i Gouraud skuggning. I figuren nedan så har jag ritat en virtuell texel som är centrerad i den punkt som sampeln ska tas. I normalt fall skulle det vara det övre vänstra hörnet, men istället beräknas den andel av texeln som sammanfaller med den virtuella texeln, dvs vikten av den övre vänstra texelns andel i sampeln, i figuren variabel a, och på samma sätt andelarna av de andra texlarna. Sampeln får då för varje färgkomponent, luminansen i varje texel gånger sin andel i den virtuella pixeln. 19
Figur 8. Bilinjärt filter 4.2.2 Mip mapping Bilinjär filtreringen eliminerar det värsta av aliasfenomenet, men det är ganska onödigt egentligen. Mip är en förkortning av det latinska uttrycket multum in parvam, vilket betyder flera i några. Mip mapping är en teknik som går ut på att använda färdigt filtrerade texturer och successivt byta ut till mindre versioner ju längre bort texturen befinner sig [5][9]. Oftast gör man det men en frekvens på en potens på två, men alternativt kan man byta texturer oftare. Figuren nedan visar en typisk mip karta som innehåller färgkomponentvis uppdelade mipnivåer. Figur 9. Mip karta Källa <http://www.relisoft.com/science/graphics/mip.html> 4.2.3 Trilinjär filtrering (Trilinear filtering) Med mipavbildning uppstår ett problem, nämligen på det avstånd där en mipnivå byts ut mot en annan så syns en tydlig skarv. För en jämnare övergång används trilinjär filtrering, som är helt enkelt en bilinijär filtrering utförd mellan två mip nivåer. 20
Figur 10. Jämförelse av Bilinjär och Trilinjär filtrering. Källa: <http://graphics.tomshardware.com/graphic/20040603/ati_optimized-03.html> 4.2.4 Anisotropisk filtrering (Anisotropic filtering) Vid snäva vinklar uppstår det ett annat problem; texturen blir suddig. Det här problemet kan man lösa med Anisotropisk filtrering. Anisotropi är ett begrepp som tagits från fysiken. Isotropi gäller för objekt som har samma egenskaper oberoende riktning. Anisotropi gäller för objekt vars egenskaper varierar beroende på riktning. Bilinjär och trilinjär filtrering är båda isotropiska i den mening att de är oberoende av vilken vinkel vi ser texturytan. I branta vinklar, som tex. golv som sträcker sig mot horisonten, borde egentligen flera texlar i vertikal led ingå filtermönstret än i horizontalled, men om det inte gör det så kommer resultatet att bli bara suddigare i ju brantare vinkel vi ser på texturen. Anisotropiska filter är anpassade för att lösa det här problemet genom att ta flera antal samples i någon given riktning. I figuren nedan är en jämförelse av alla hittils genomgångna filtreringsmetoder samt vanlig punktsampling längst till vänster. Punktsamplingen lider av grova aliasfenomen som försvinner bilinjär filtrering. Mip mapping tycks faktiskt ge sämre resultat, och orsakar en skarv, som inte syns så särledes bra i figuren om man inte ser noga i mitten regionen. Trilinjär filtrering har ingen sådan skarv. Men medan alla filtreringsmetoder ger en suddig bild ju längre mot horisonten vi går, så gör inte anisotropisk filtrering det. Det är däremot den dyraste av alla filtreringsmetoder. 21
Figur 11. Jämförelse, från vänster: Utan filter, bilinjärt filter, mip mapping, trilinjär filtrering, anisotropisk filter. Källa: <http://graphics.tomshardware.com/graphic/20040603/ati_optimized-03.html> 4.3 Skanlinjerendering Den vanligaste renderingsproceduren är skanlinjerendering. Den går ut på att man systematiskt går igenom varje polygon som ska renderas, delar upp den i en bildpunkt höga, eller alternativt breda bildpunktsremsor som kallas för skanlinjer, en procedur som kallas för skanlinjekonvertering [3]. Sedan itereras varje skanlinje och plottas ut bildpunkt för bildpunkt från kant till kant. Proceduren att ge varje punkt sin färg kallas raserisering och räknas med texturavbildning. Skanlinjekonverteringen kan implementeras på olika sätt beroende på typen av polygoner som används. Komplexa polygoner kan delas upp till konkava, konkava polygoner kan delas upp till konvexa och konvexa polygoner kan delas upp till trianglar, där varje steg förenklar konverteringen. Ett problem som måste lösas är synlighetsproblemet. Vissa polygoner kan täcka andra och därför borde inte den täckta polygonen överskriva den täckande polygonen. Det här problemet kan man lösa på flera sätt, bland annat med occlusionsfilter och z-buffring. En z-buffer är en bitkarta som innehåller avstånden till den renderade bildpunkten, som uppdateras varje gång en ny pixel ritas på samma plats, men endast om den befinner sig närmare. Occlusionsfilter innehåller listor med skanlinjer som har renderats, som man klipper av från varje ny skanlinje som ska renderas. Skanlinjerenderingen klarar av att rendera transparenta polygoner, i vilket fall man tar ett vägt medeltal av den transparent 22
bildpunkten och bakgrunden. Däremot klarar den inte av reflektioner eller brytning av ljus, vilka kräver en mer sofistikerad algoritm, nämligen raytracing. 4.4 Raytracing Raytracing [5] är en rekursiv renderingsalgoritm som i motsats till skanlinjealgoritmen tar också i beaktande belysning och skuggfenomen, samt reflektioner och refraktion, dvs. brytning av ljus i genomskinliga föremål. Som namnet antyder, så går algoritmen ut på att man följer en stråle och spårar upp dess ursprung. Istället för att gå igenom primitiver så går raytracing igenom varje bildpunkt, vilket gör att raytracing blir ineffektiv i jämförelse med skanlinje algoritmen som skippar områden som saknar polygoner, men å andra sidan spelar det inte så stor roll om hela bilden är täckt med dem. Man itererar alltså genom varje bildpunkt varigenom man skjuter en stråle från brännpunkten, och undersöker sedan om den träffar något föremål, och ifall flera, vilket det närmaste är. Man itererar alltså genom varje objekt på scenen och varje gång en kollision hittas som ligger närmare projektionen så överskriver man den tidigare. När alla objekt är genomgångna, så undersöks först objektets relation till alla ljuskällor. Finns något objekt mellan ljuskällan och kollisionspunkten så bidrar inte den ljuskällan utan lämnar punkten i en skugga. Det här görs på samma sätt som tidigare, att man skjuter en stråle mot varje ljuskälla och undersöker om det uppstår kollisioner. Den här gången räcker det däremot med att en kollision hittas, varefter proceduren kan avbrytas. Vidare så undersöks andelen ljus som reflekteras i ytan genom att man skjuter en stråle som skjuts i riktning spegelvänt från ytnormalen i motsats riktning. Andelen ljus bestäms sedan rekursivt genom att man kallar på samma funktion som för de ursprungliga strålarna, fast med en cut-off dvs. en parameter som bestämmer det maximala rekursionsdjupet. Ytterligare så måste också andelen ljus bestämmas som bryts i objektet, ifall objektet är genomskinligt. Den brutna strålen undersöks på samma sätt som i fallet med reflektion. En given andel bestäms också av själva ytmaterialet, och den mängd ljus som är omgivande. I jämförelse med skanlinjerenderingen så tar raytracing oftast betydligt mera resurser men ger också i allmänhet bättre resultat. raytracing kan ändå optimeras att köras i realtid, fast optimeringarna kan inte göras lika bra som i skanlinjerenderingen på grund av att reflektions och refraktionsfenomenen hindrar effektiv gallring. Raytracing är betydligt populärare när det gäller fotorealistisk rendering, medan skanlinjekonvertering används nästan uteslutande i spel, som kräver snabb rendering. Därför har hårdvarustöd utvecklats för skanlinjerenderingen i form av grafikkort. I figuren nedan så syns hur raytracing går till väga rekursivt. R-strålarna är reflektioner medan T-strålarna är strålar som brutits i materialet. S strålarna är strålar som skickas mot ljuskällorna för att undersöka om de är i skugga eller inte. 23
Figur 12. Ray tracing Källa:<http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtillumi. htm> 4.5 Radiosity Raytracing ger faschinerande resultat, men inte alltid så verklighetstrogna som de skulle kunna vara. En alternativ metod är Radiosity[5][3], som baserar sig på värmelära. Man kan förlikna ljus och termisk strålning, och räkna ut hur mycket utstrålningen av ljus från olika ytor påverkar varandra. Det mänskliga ögat är känsligt för radiositet och märker genast skilnad på verkligheten och en datorgenerad bild, speciellt om den inte genererats med beaktande av radiositet. Närliggande objekt har en tendens att färga av på varandra och på så sätt inge nyanser som får det att verka mer naturtroget. Ekvationen för mängden ljus som avges från ytan i är B i = E +p B j Ai Aj cos(φ i ) cos(φ j ) /(πr 2 ) da i da j, där E är ytans emmitans, p är ytans reflektivitet, B j är yta j s radiositet, φ i är strålens vinkel till yta i s normal, r är avståndet [3]. En intuitiv förklaring är följande: Det är ju fråga om diffust ljus, så enligt cosinuslagen så påverkar den inkommande vinkeln proportionellt med cosinus av vinkeln. Cosinus för vinkeln till normalen för ytan som avger ljus är i sin tur proportionell till hur synlig den ytan är för mottagaren, av samma skäl. Kvadraten på avståndet mellan ytan påverkar omvänt proportionellt, eftersom samma strålar som passerar igenom en yta på dubbla avståndet är fyra gånger så stort. I stort sätt är det alla faktorer som inverkar, men så måste vi integrera över båda 24
ytorna och göra det samma för varenda yta. Dessutom så kan ytan själv avge ljus, något som är förträffligt då man vill ha tvådimensionella ljuskällor. Så här brukar man ändå inte göra, för det skulle vara för kostsamt, utan man använder en så kallad hemicube approximation där ljuset projiceras i en halverad kub som ligger ovanpå ytan [3]. Radiosity är i allmänhet en ganska kostam procedur och används därför inte i realtidsrendering, men å andra sidan är radiosity utmärkt för statiska scener och kan därför användas i realtidsrendering för att få statisk objekt att verka mer realistiska. Trots kostnaderna kan radiosity optimeras på bekostnad av onödig precision att fungera i realtid också för dynamiska objekt. I motsats till raytracing klarar den bara av diffust ljus, men ger oftast ett mycket mer verklighetstroget intryck. Vill man ha specialeffekterna så lönar sig däremot raytracing. Det har ändå vissa brister vad gäller brytning av ljus, varför man har utvecklat en metod som kallas för caustic rendering. 4.6 Caustic rendering och Photon mapping Caustic kommer från grekiskan caustic som betyder att bränna. Om man håller ett förstorignsglas upp så bryts ljuset och samlas i en punkt som kallas brännpunkten, varifrån namnet kommer. Om man ser på bottnet i klart vatten så kan man se olika mönster som uppstår just på grund av att ljuset bryts på en vågig vattenyta. Sådana effekter kan man inte åstadkomma med varken strålföljning eller radiositet utan kräver en mera sofistikerad metod. Caustic rendering påminner om strålföljning, bara att det sker bakvänt, dvs. man följer strålar från ljuskällan inte från ögat. Det här kan man göra på flera sätt och jag tar upp en metod här som kallas fotonavbildning [8], och är en av de snabbaste algoritmerna för att hantera global belysning. Den går ut på att man skjuter ut ett tusen till miljontal fotoner från ljuskällorna, följer deras väg och sparar sedan deras desitnationer på en fotonkarta [6]. Istället för att fylla hela kartan med fotoner så estimerar man statistiskt resten av ytan. Renderingen sker på samma sätt som i strålföljning men för indirekt ljus så används fotonkartan istället. Caustic rendering blir i allmänhet långsammare än enbart strålföljning men ger mycket bättre resultat i fråga om indirekt ljus. Strålföljning klarar endast av bildreflektioner, men inte reflektioner av ljus som samlas. Radiositet är betydligt bättre på indirekta reflektioner men klarar endast av grova och matta ytor och är dessutom extremt kostsam. Blanka ytor, och Caustica reflektioner klarar den inte av, i motsats till Caustic rendering. Nedanför är två bilder renderade med Caustica reflektioner. 25
Figur 13. Caustics Källa: <http://graphics.cs.ucf.edu/caustics/> 5 Diskussion Det finns en hel del mera att säga om de olika metoder som jag nämnt, men för att inte uppsatsen ska bli alltför lång så måste jag sammanfatta och ge en överblick av vad det är fråga om utan att gå in på detaljer. För att åstadkomma verklighetstrogna bilder, så måste man först veta ungefär vad som krävs, vilka typer av effekter man vill utnyttja med tanke på hur bilden ska se ut, och på basen av detta välja bland de alternativa metoderna. Om man vet ungefär vad dessa metoder erbjuder och på vilken kostnad så fattas bara att implementera dem. När det gäller realtidsrendering så måste man däremot också kunna optimera grafikmotorn vilket kräver mera erfarenhet i ämnet, men den här uppsatsen så har jag ämnat åt att ge en kort sammanfattning av metoderna så att man får en inblick i vad man har att göra med. Det finns förståss färdiga program som klarar av de flesta av de här sakerna, men ofta om man vill få resultatet just som man själv vill så är det bäst att man programmerar dem själv. 26
Litteraturförteckning: [1] Schneider Philop J. Geometric tools for computer graphics. San Francisco, CA : Morgan Kaufmann, 2003 [2] Xichun Jennifer Guo. Kollat 17.10.2005. Phong Shading and Gouraud Shading. <http://www.nbb.cornell.edu/neurobio/land/oldstudentprojects/cs490-95to96/guo/report.html> [3] G. Scott Owen, ändrat 6.6.2005. Hypergraph. <http://www.siggraph.org/education/materials/hypergraph/hypergraph.htm> [4] William Shoaff, ändrat 4.1.2006. Bilinear filtering <http://wiki.beyondunreal.com/wiki/bilinear_filtering> [5] Pascal Vuylsteker, ändrat 20.4.2004 Computer Graphics 2003 / Semester 2 <http://escience.anu.edu.au/lecture/cg/index.en.html> [6] Zack Water, kollat 17.10.2005 Photon Mapping http://web.cs.wpi.edu/~emmanuel/courses/cs563/write_ups/zackw/photon_mapping/phot onmapping.html> [7] C.K. Shene, 3.12.2003 - Introduction to Computing with Geometry Notes <http://www.cs.mtu.edu/~shene/courses/cs3621/notes/> [8] Yves puissant, 2003 Photon mapping in A:M <http://www.ypoart.com/tutorials/photon-mapping.htm> [9] Midori Kitagawa, kollat 23.11.2005 - texture mapping <http://atec.utdallas.edu/midori/handouts/texture_mapping.htm> [10] Richard leader, kollat 18.1.2006 - anisotropic filtering <http://www.richleader.com/bargainbinreview_anisotropic-filtering.htm> 27