Realtidsalgoritmer för ljusets spridning och absorption mot partiklar i luften P E T E R L Ö N N Q U I S T

Relevanta dokument
Spelutveckling 3d-grafik och modellering. Grunder för 3d-grafik Blender Animering

PROCEDUELL TERRÄNG. Proceduella metoder för bilder (TNM084) Jimmy Liikala Institutionen för teknik och naturvetenskap

Grafiska pipelinens funktion

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

Procedurell Terräng med LOD i OpenGL 4

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

Procedurell 3D-eld på grafikkortet

Procedurell renderingsmotor i Javascript och HTML5

Grafiska pipelinen. Edvin Fischer

Parabeln och vad man kan ha den till

Rastrering och displayalgoritmer. Gustav Taxén

Inledning. Kapitel Bakgrund. 1.2 Syfte

TNM022 Proceduella Bilder Rendering av proceduell päls i realtid

Shaders. Renderingssystem. Renderingssystem. Renderingssystem. Hårdvara för 3D-rendering. Hårdvara för 3D-rendering

Omtentamen TNM077, 3D datorgrafik och animering (samt även TNM008, 3D datorgrafik och VR)

Parabeln och vad man kan ha den till

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Bézierkurvor och parametriska objektrepresentationer

TANA17 Matematiska beräkningar med Matlab

Koordinatsystem och Navigation

Tentamen TNM061, 3D-grafik och animering för MT2. Tisdag 3/ kl 8-12 TP51, TP52, TP54, TP56, TP41, TP43. Inga hjälpmedel

Omtentamen. TNM077 3D-datorgrafik och animering kl 8-12 Inga hjälpmedel. (samt även TNM008 3D-datorgrafik och VR)

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Shaders. Gustav Taxén

TAIU07 Matematiska beräkningar med Matlab

Vi har väl alla stått på en matta på golvet och sedan hastigt försökt förflytta

Transformationer i 3D. Gustav Taxén

Tentamen TNM061 3D-grafik och animering för MT2 och DAV1

Teknik för avancerade datorspel!

Teknik för avancerade datorspel!

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht Block 5, översikt

Vågfysik. Geometrisk optik. Knight Kap 23. Ljus. Newton (~1660): ljus är partiklar ( corpuscles ) ljus (skugga) vs. vattenvågor (diffraktion)

Rumsuppfattning är förmågan att behandla sinnesintryck av former

Final i Wallenbergs Fysikpris

Datorgrafik Ray tracing. Mattias Ekström, Västerås,

Texturerade 3D-modeller

Robotarm och algebra

Robin Wahlstedt Datavetenskap / Spel Vetenskapsmetodik rwt07001@student.mdh.se. Datorgrafik i spel

Grafik raytracing. Mattias Axblom.

Spelutveckling - Scenegrafer. Scenegrafer Optimeringar Culling

Geometriska transformationer

TBSK 03 Teknik för Advancerade Datorspel

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

P Q = ( 2, 1, 1), P R = (0, 1, 0) och QR = (2, 2, 1). arean = 1 2 P Q P R

Realtids-strålföljning med geometriska primitiver på programmerbara grafikprocessorer (HS-IDA-EA )

5 Linjär algebra. 5.1 Addition av matriser 5 LINJÄR ALGEBRA

Avalanche Studios. OpenGL. Vår teknik. Våra spel. Lite inspiration... Stora, öppna spelvärldar. Sandbox-gameplay. Hög audiovisuell standard

Gel esimulering 22 mars 2008

OPTIK läran om ljuset

Poincarés modell för den hyperboliska geometrin

Skinning and Animation

Om ellipsen och hyperbelns optiska egenskaper

FYSIKUM STOCKHOLMS UNIVERSITET Tentamensskrivning i Vågrörelselära och optik, 10,5 högskolepoäng, FK4009 Tisdagen den 17 juni 2008 kl 9-15

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

Institutionen för matematik och datavetenskap Karlstads universitet. GeoGebra. ett digitalt verktyg för framtidens matematikundervisning

Bemästra verktyget TriBall

EXPERIMENTELLT PROBLEM 2 DUBBELBRYTNING HOS GLIMMER

Realtidsskuggalgoritmer för virtuella 3D-världar på modern grafikhårdvara M A R C U S B E A U S A N G

DGI/SUDOA Den historiska utvecklingen. Globala - lokala belysningsmodeller. Lokala belysningsmodeller. Rendering equation

Bemästra verktyget TriBall

Designing a Shading System. David Larsson

Modul 1: Komplexa tal och Polynomekvationer

. b. x + 2 y 3 z = 1 3 x y + 2 z = a x 5 y + 8 z = 1 lösning?

Projekt i TNM084, Procedurella bilder

Repetition + lite av varje. Ulf Assarsson Department of Computer Engineering Chalmers University of Technology

Karta över Jorden - viktigt exempel. Sfär i (x, y, z) koordinater Funktionen som beskriver detta ser ut till att vara

After Effects Lathund

LABORATION 1 AVBILDNING OCH FÖRSTORING

Observera också att det inte går att både se kanten på fönstret och det där ute tydligt samtidigt.

7 Olika faltningkärnor. Omsampling. 2D Sampling.

Repetition, Matematik 2 för lärare. Ï x + 2y - 3z = 1 Ô Ì 3x - y + 2z = a Ô Á. . Beräkna ABT. Beräkna (AB) T

Polarisation. Abbas Jafari Q2-A. Personnummer: april Laborationsrapport

Moment 4.2.1, 4.2.2, 4.2.3, Viktiga exempel 4.1, 4.3, 4.4, 4.5, 4.6, 4.13, 4.14 Övningsuppgifter 4.1 a-h, 4.2, 4.3, 4.4, 4.5, 4.

Varför behövs grafikbibliotek? Introduktion till OpenGL. OpenGL är ett grafikbibliotek. Fördelar med OpenGL. Allmänt om OpenGL. Nackdelar med OpenGL

Speciell relativitetsteori inlämningsuppgift 2

Laboration - Shaders

Information Coding / Computer Graphics, ISY, LiTH. Bump mapping!

Den tekniska utvecklingen av hårdvara och mjukvara för realtidsgrafik

Uppgifter. Uppgifter. Uppgift 2. Uppgift 1

Studieanvisning i Optik, Fysik A enligt boken Quanta A

Undersökande arbetssätt i matematik 1 och 2

Här är ett väldigt bra tidpunkt att spara scenen. Jag har valt att bygga ett litet pyramidtorn.

729G43 Artificiell intelligens (2016) Maskininlärning 2. Marco Kuhlmann Institutionen för datavetenskap

Tentamen TNM077, 3D datorgrafik och animering

Institutionen för Fysik Polarisation

Att beräkna:: Avstånd

Fysik (TFYA14) Fö 5 1. Fö 5

Mer om analytisk geometri

Översikt. Bildsyntesens huvudmålsättning. Ljusmodeller. Simulerat ljusspektra till datorskärm? Ljusspektra. En introduktion till bildsyntes

3. Välj den sprajt (bild) ni vill ha som fallande objekt, t ex en tårta, Cake. Klicka därefter på OK.

λ = T 2 g/(2π) 250/6 40 m

1 Den Speciella Relativitetsteorin

Vektorgeometri för gymnasister

Ljusets polarisation

VISUELLA FÖRHÅLLANDEN

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

3. Ljus. 3.1 Det elektromagnetiska spektret

Vektorgeometri för gymnasister

Strömsholmen. Mårten Svensson, Peter Zhu, Andreas Wetteborn,

Transkript:

Realtidsalgoritmer för ljusets spridning och absorption mot partiklar i luften P E T E R L Ö N N Q U I S T Examensarbete Stockholm, Sverige 2006

Realtidsalgoritmer för ljusets spridning och absorption mot partiklar i luften P E T E R L Ö N N Q U I S T Examensarbete i datalogi om 20 poäng vid Programmet för datateknik Kungliga Tekniska Högskolan år 2006 Handledare på CSC var Lars Kjelldahl Examinator var Lars Kjelldahl TRITA-CSC-E 2006:097 ISRN-KTH/CSC/E--06/097--SE ISSN-1653-5715 Kungliga tekniska högskolan Skolan för datavetenskap och kommunikation KTH CSC 100 44 Stockholm URL: www.csc.kth.se

Referat Att simulera fenomen som uppstår i våran omgivning har länge varit ett stort forskningsområde inom datorgrafik. I dagens datorspel ställs stora krav på att miljöerna är visuellt attraktiva och så naturtrogna som möjligt. För att ytterligare öka realismen i datorspel är det önskvärt att inkludera det fenomen som uppstår då ljusstrålar sprids och absorberas mot partiklar i luften. Bland annat uppstår skenet runt en ljuskälla under en dimmig kväll på grund av att ljusstrålar sprids och når vårat öga från olika riktningar. Även den ljuskon som bildas i exempelvis en rökfylld studio uppkommer på grund av detta fenomen. Ljuset spridning och absorption mot partiklar är beräkningsmässigt komplicerat och rapporten syftar till att göra en noggrann undersökning av tidigare forskning kring algoritmer som simulerar fenomenet i realtid. Speciellt har metoder som använder sig av datorns grafikhårdvara utvärderats med tanke på lämpligheten att införa algoritmen i en komplex grafikmotor. För att kunna inkluderar en algoritm i exempelvis ett datorspel ställs speciella krav på dess effektivitet i och med att datorspel innehåller många andra beräkningskrävande algoritmer som kräver mycket processorkraft. Arbetet presenterar även en metod som approximerar ljusets interaktion med partiklar i luften genom att definiera tredimensionell geometri bestående av polygoner. Metoden är effektiv och är enkel att inkludera i en befintlig grafikmotor.

Abstract Real-Time Light Scattering in Participating Media In the field of computer graphics, simulation of natural phenomena has always been an important research subject. The visual appearance of todays computer games is becoming more and more important. The effect of light scattering in participating media will increase the visual experience of the 3D scene. The glows around light sources on a misty evening is due to light reaching the viewer from different directions. Studio spotlights that produce an illuminated volume is also because light scatters and absorbs against particles in the atmosphere. Light scattering in the atmosphere is very time consuming to calculate and the thesis main purpose is to summarize the research previously made in the area of light scattering. Methods that uses the modern graphic hardware has mostly been studied in the terms of how easy the algorithm is to implement in an complex graphics engine. Special requirements is made on these methods because computer games contains other time consuming processes that demand a large portion of the computers resources. The thesis also proposes a method that simulates light scattering in participating media through 3D geometry and an easy to understand rendering algorithm. The method is fast and simple to include in an existing graphics engine.

Innehåll 1 Introduktion 1 1.1 Mål och syfte............................... 2 1.2 Metod................................... 2 1.3 Översikt.................................. 2 2 Bakgrund 5 2.1 Grafik hårdvara.............................. 5 2.1.1 Introduktion........................... 5 2.1.2 Transformationer och koordinatsystem............. 7 2.1.3 Texturering............................ 9 2.1.4 Programmerbarhet i grafikprocessorer............. 10 2.2 Ljusvolymer................................ 12 2.2.1 Grundläggande teori....................... 12 2.2.2 Spridningsekvationen....................... 13 2.2.3 Metoder för att rendera spridningsekvationen......... 15 2.3 Dimmiga miljöer............................. 20 2.3.1 OpenGL dimma......................... 20 2.3.2 Icke homogen dimma....................... 22 3 Arbetet 29 3.1 Isotropisk punktljuskälla......................... 29 3.1.1 Implementation.......................... 31 3.1.2 Begränsningar i metoden.................... 32 3.2 Volym från en riktad ljuskälla...................... 32 3.2.1 Implementation.......................... 33

3.2.2 Begränsningar i metoden.................... 36 4 Resultat och slutsatser 39 Litteraturförteckning 43

Figurer 2.1 Standard grafik-pipeline........................... 6 2.2 Tangent-Space................................ 8 2.3 Tvådimensionell texturering......................... 9 2.4 Texturmappning av en cylinder....................... 10 2.5 Programmerbar grafik-pipeline. Illustrerar flödet mellan vertex-shader och pixel-shader................................ 11 2.6 Illustration av hur ljusstrålar interagerar med partiklar i luften..... 12 2.7 Ljus sprids och orsakar ett starkt sken runt en punktljuskälla...... 13 2.8 Illustration av komplexiteten i att simulera ljusets interaktion med partiklar...................................... 14 2.9 Ljus sprids en gång och färdas i riktning mot en betraktare....... 14 2.10 Billboard-plan orienterad mot en betraktare................ 15 2.11 Artefakter för Billboards-metoden..................... 16 2.12 Beräkna kortaste avståndet mellan ljuskälla och betraktarvektor för att simulera skenet runt en ljuskälla....................... 16 2.13 Exempel på ATIs metod för att rendera skenet runt en ljuskälla.... 17 2.14 Evaluera spridningsekvationen med hjälp av samplingsplan....... 18 2.15 Samplingsplan belägna inuti ett ljusfrutum................ 19 2.16 Sikt och kontrast mellan föremål reduceras på grund av dimma..... 20 2.17 Skärmdumpar på en scen renderad med dimma.............. 21 2.18 OpenGL s funktioner för att beräkna dimma............... 22 2.19 Noise-textur för att rendera moln...................... 22 2.20 Endimensionell noise-funktion........................ 23 2.21 Interpolerad noise-funktion.......................... 24 2.22 Utjämnad noise-funktion........................... 24

2.23 Tvådimensionella Perlin noise-texturer................... 25 2.24 Perlin s turbulenstextur........................... 26 3.1 Ljus sprids och färdas i riktning mot en betraktare............ 30 3.2 3D-graf för funktionen F (u, v)....................... 31 3.3 Funktionen F (u, v) som en tvådimensionell textur............ 32 3.4 Exempel på upplysta ljusvolymer...................... 33 3.5 Textur för att uppskatta hur ljuset avtar vertikalt längs ljuskonen... 34 3.6 Problem vid silhuett-avkänning....................... 34 3.7 Tangent-space för några hörn på ljuskonen................. 35 3.8 Beräkning av konens silhuett........................ 35 3.9 Problem då ett föremål skär ljuskonen................... 36 3.10 Illustration av de olika stegen för att rendera en ljuskon.......... 38 4.1 Skillnaden mellan Suns metod och billboards då en ljuskälla placeras intill en vägg.................................. 39 4.2 Storleken på skenet bestäms delvis av avståndet till betraktaren.... 40 4.3 Dimmans spridningskoefficient bestämmer storleken på skenet...... 40 4.4 Exempel på hur ljusvolymen kan användas................ 41

Kapitel 1 Introduktion Att simulera fenomen som uppstår i våran omgivning har länge varit ett stort forskningsområde inom datorgrafik. I dagens datorspel ställs stora krav på att miljöerna är visuellt attraktiva och så naturtrogna som möjligt. För att ytterligare öka realismen i datorspel är det önskvärt att inkludera det fenomen som uppstår då ljusstrålar sprids mot partiklar i luften. Detta fenomen är beräkningsmässigt komplicerat och genom åren har många metoder föreslagits för att visualisera fenomenet i realtid. Utan att gå in i detalj reduceras ofta komplexiteten i problemet genom att göra en mängd olika approximationer för hur ljusstrålar interagerar med partiklar. De effekter som uppstår på grund av detta fenomen inkluderar det sken som bildas runt exempelvis en gatlykta under en dimmig kväll, eller den ljuskägla som bildas på grund av att en lampa eller spotlight sänder ut ljusstrålar i begränsade riktningar. Anledningen till att skenet uppstår beror på att de ljusstrålar som gatlyktan sänder ut sprids mot partiklar i luften och når vårat öga från olika riktningar. En ljusstråle kan påverkas av flera partiklar innan den når betraktaren vilket leder till att komplexiteten för problemet är stort i och med att flera spridningshändelser måste betraktas. En annan faktor som spelar in vid simuleringen av dessa fenomen är att den intensitet som ljusstrålarna har även absorberas då de interagerar med partiklar, exempelvis kan en del av intensiteten absorberas och den andra delen färdas i en ny rikting. Sannolikheten att en ljusstråle kolliderar med en partikel beror på partikelkoncentrationen i luften och sträckan som ljuset färdas. En hög koncentration av partiklar i luften ger en tätare dimma och sannolikheten för att ljuset sprids mot en partikel är därför hög. Andra effekter som uppstår på grund av dimma, och då speciellt tät dimma, är att sikten försämras och att föremål i omgivningen tappar kontrast, det vill säga konturerna mellan bakgrund och föremålens kanter suddas ut och blir därmed svårare att urskilja. 1

KAPITEL 1. INTRODUKTION 1.1 Mål och syfte Huvudmålet med detta projekt är att göra en noggrann undersökning och analys av den forskning som tidigare gjorts inom området och återge materialet i en sammanfattning. Utöver undersökningen och sammanfattningen ingår framtagandet av en metod som på ett trovärdigt och effektivt sätt kan simulera hur ljus sprids mot partiklar och därmed bildar skenet som omger punktljuskällor i en dimmig miljö. Även en metod för den ljusvolym som bildas då ljuset från en riktad ljuskälla interagerar med partiklar skall utvecklas. Metoderna skall fungera i realtid och vara enkla att inkludera i en befintlig grafikmotor. Exempel på frågeställningar som besvaras i denna rapport är bland annat: Är det möjligt att lätt integrera dessa effekter i en komplex grafikmotor? Hur effektiva är metoderna? Vad är fördelarna respektive nackdelarna med en specifik metod? 1.2 Metod Projektet har utförs i följande steg: En omfattande studie av tidigare arbeten inom området. Material som simulerar fenomenen på ett korrekt fysikaliskt sätt har studerats, men även metoder som renderar effekterna utan att ta hänsyn till fysiken har speciellt använts. Detta på grund av att ett av målen har varit att inkludera implementationen i ett datorspel som kräver hög prestanda. Implementation och analys av metoder som kan användas i realtid, det vill säga inkluderas i ett datorspel. Detta har mestadels gjorts i Microsoft DirectX grafik API, Microsoft HLSL (High Level Shading Language) samt NVIDIA CG. Grafikhårdvara har varit ett NVidia GeForce 7800 GT grafikkort. En noggrann dokumentation av ovanstående steg som i slutändan resulterar i en skriftlig rapport. 1.3 Översikt Kapitel 2 behandlar grundläggande teori om hur ljus sprids och absorberas mot partiklar i luften. Spridningsekvationen som beskriver detta fenomen definieras och förklaras. Kapitlet innehåller även tidigare arbeten inom området samt en kort introduktion till grafikkortets hårdvara och dess möjligheter. I kapitel 3 förklaras det arbete som utförts i samband med detta projekt. Två metoder som renderar de effekter som uppstår då ljus interagerar med partiklar i realtid 2

1.3. ÖVERSIKT presenteras i kapitlet. För varje metod diskuteras lämpligheten att implementera metoden i en grafikmotor samt de visuella och tekniska begränsningar som existerar. Resultat och slutsatser diskuteras i kapitel 4 där skärmdumpar från implementationerna återger det visuella resultatet av metoderna från kapitel 3. 3

Kapitel 2 Bakgrund Kapitlet behandlar nödvändig teori för att förstå det fenomen som uppstår då ljus sprids mot partiklar i luften. Grundläggande begrepp och ekvationer beskrivs i avsnitt 2.2 där även den viktiga spridningsekvationen definieras. Ekvationen beskriver intensitetsbidraget som uppkommer på grund av att ljuset sprids mot partiklar och fortsätter i riktning mot en betraktare. För läsare med liten eller ingen kunskap i området grafikhårdvara och renderingsmetoder ges i avsnitt 2.1 en kort beskrivning av grundläggande begrepp för att förstå fortsättningen av rapporten. Vidare ges en sammanfattning av tidigare forskningsresultat inom området. Speciellt diskuteras fördelar och nackdelar vid införandet av metoderna i en befintlig grafikmotor. 2.1 Grafik hårdvara Avsnittet ger en kort introduktion till modern grafikhårdvara för läsare med ingen eller liten kunskap inom området. Först följer en introduktion till hur grafikprocessorn i en dator hanterar tredimensionell geometri och hur den renderar pixlar på en skärm. Därefter följer en kort beskrivning av hur föremål i ett datorspel färgsätts genom att klistra en bild (textur) på föremålets yta. Vidare diskuteras också de stora möjligheterna som dagens grafikhårdvara ger för att rendera komplicerade effekter genom att använda ett så kallat High Level Shading Language. 2.1.1 Introduktion De flesta grafik API:er (OpenGL, DirectX) har en så kallad grafik-pipeline vars huvudsakliga uppgift är att ta en beskrivning av en tredimensionell representation 5

KAPITEL 2. BAKGRUND av en miljö och transformera den till en tvådimensionell bild som kan visas på en skärm. Figur 2.1. Standard grafik-pipeline. En applikation sänder hörnen för en primitiv till steget som transformerar hörnen så att de kan visas på en tvådimensionell skärm. Dessa hörn skickas i sin tur vidare till primitivkonstruktion och rastrerings steget som har till uppgift att skapa fragment baserat på informationen om primitiven. Fragmenten skickas därefter till steget som texturerar och färgsätter fragmentet och slutligen utförs en rad olika tester som avgör om ett fragment skall uppdatera en pixel på skärmen. Ett 3D-program skickar hörnen i en tredimensionell primitiv till grafikprocessorn (GPU). De hörn som tillsammans bildar en primitiv kallas med en gemensam benämning för vertex och en primitiv kan exempelvis vara en polygon, linje eller punkt. Ett hörn innehåller i sin tur olika attribut så som färg, texturkoordinater (Behandlas i avsnitt 2.1.3) och en normal. När en samling hörn skickas till GPUn utförs en rad olika steg för att i slutändan kunna visa en tvådimensionell bild på skärmen. Figur 2.1 illustrerar de olika stegen som hörnen går igenom i en grafik-pipeline. Transformation av hörn Målet för det första steget är att konvertera ett hörns position till en tvådimensionell skärmposition. Detta görs med en rad olika transformationer som beskrivs mer utförligt i avsnitt 2.1.2. Andra uppgifter som görs i detta steg är ljussättning för att avgöra hörnets färg och texturkoordinatgenerering. Primitivkonstruktion och rastrering Hörnen från föregående steg samlas ihop och konverteras till en primitiv baserad på information som följer med en sekvensen av hörn. Den konstruerade primitiven kan även behövas klippas av beroende på om den kommer att synas på skärmen eller inte. Geometri och fragement som inte kommer synas i den slutgiltiga bilden är ingen idé att fortsätta behandla. Vidare kan även detta steg exkludera polygoner 6

2.1. GRAFIK HÅRDVARA baserat på hur de är orienterade. Exempelvis behöver inte en polygon som har sin baksida orienterad mot betraktaren renderas. Rastrering är den process som konverterar en geometrisk beskrivning av en primitiv till en fragmentrepresentation. Primitiven fylls med fragment som kan ses som en eventuellt pixel som slutligen kommer att uppdatera en bildpunkt på skärmen. Texturering och färgsättning Då en primitiv har rastrerats till en samling fragment färgsätts fragmenten beroende på textur, dimma och färg. Utöver detta kan ett nytt djup för fragmentet beräknas och eventuellt kan fragmentet kastas bort och därmed undvika fler operationer på fragmentet. Texturering och färgsättningssteget returnerar, beroende på om djuptestet uppnåddes, färgsatta fragment som skickas till det slutgiltiga pixeloperationssteget. Pixeloperationer Detta steg gör en rad olika tester på de inkommande fragmenten. Bland annat testas om ett fragment skyms av andra, olika positions- och genomskinlighetstester. Om något av dessa tester fallerar kan fragmentet kastas bort utan att uppdatera en bildpunkt på skärmen. Passerar fragmentet alla tester sker en uppdatering av färgvärdet för en bildpunkt på skärmen. 2.1.2 Transformationer och koordinatsystem Uppgiften för en grafik-pipeline, som tidigare sagts, är att ta tredimensionell geometri och sedan producera en tvådimensionell bild som kan visas på skärmen. Indata är hörn som bildar polygoner (vanligtvis trianglar) och utdata är en bild som en presumtiv kamera skulle se på den virtuella miljön. För att åstadkomma denna bild måste en rad olika transformationer göras på de inkommande hörnen. Följande avsnitt beskriver kort de viktigaste koordinatsystemen och transformationerna. Objektrymd Objektrymden är det koordinatsystem där 3D-modeller definieras. En 3D-artist som skapar modeller i ett modelleringsverktyg gör det i ett lokalt koordinatsystem som är specifikt för varje modell och som nödvändigtvis inte behöver vara samma för alla modeller. Normalt sett, dock inte alltid, specificeras en modells centrum som (0, 0, 0) och modellens övriga hörn definieras relativt denna position. Alla dessa hörnpositioner är definierade i objektrymden. 7

KAPITEL 2. BAKGRUND Världrymd För att placera ut en modell i den tredimensionella världen (Världsrymden) sker en transformation från objektrymden. Denna transformation kan innehålla en skalning, rotation och/eller en translation av modellen. Varje skalning, rotation och translation beskrivs med en 4 4-matris och hela transformationen från objektrymd till världsrymd görs genom att multiplicera dessa matriser. Denna slutgiltiga matrisen, som kallas världsmatris, används alltså för att ta en hörnposition i det lokala koordinatsystem för modellen till en koordinat i världsrymden. Kamerarymd För att transformera världen så att det ser ut som om den betraktas från en specifik punkt, det vill säga kameran, krävs en transformation som för varje position i världen tar den till ett koordinatsystem som är orienterat så att kameran betraktar punkten. Transformation består alltså av en translation som förflyttar kamerans position i världsrymden till origo för kamerarymden och en rotation som roterar kameran på ett lämpligt sätt. Skärmrymd Slutligen behövs en transformation som projicerar det tredimensionella koordinatsystemet för kamerarymden till en tvådimensionell bild som kan visas på en skärm. Detta steg avgör vilka positioner som verkligen syns i den slutgiltiga bilden vilket görs genom att definiera ett så kallat frustum som specificerar synfältet för kameran. Endast de positioner som ligger innanför detta frustum kommer att rastrerats och slutligen resultera i en renderad bild. Tangent-space Figur 2.2. Normalen (N) är vinkelrät mot ytan. Tangent (T) och Binormal (B) är båda vinkelräta mot normalen samt mot varandra. Denna rymd har inget med att transformera koordinater så att de kan visas på en tvådimensionell bild utan tangent-space används oftast till att simulera en ojämn 8

2.1. GRAFIK HÅRDVARA yta på ett föremål 1. Tangent-space definieras för varje hörn och består av tre stycken vektorer: normal, tangent och en binormal. Vektorer är alla vinkelräta mot varandra som kan ses i figur 2.2. Genom att använda de tre vektorerna kan en 4 4-matris som transformerar en koordinat i objektrymden till tangent-space konstrueras. Denna transformation kommer visa sig vara viktig för att simulera den suddiga silhuett som bildas för en ljusvolym, vilket presenteras senare i rapporten. 2.1.3 Texturering För att uppnå så realistiska virtuella miljöer som möjligt spelar färg- och ljussättning av föremål i en miljö stor roll. Homogena material som exempelvis plast kan simuleras på ett effektivt sätt genom att välja en ljussättningsmodell som stämmer överens med plast. För andra ytor som exempelvis sten och trä behövs andra sätt för att simulera materialet. För att rendera dessa material klistras en tvådimensionell bild (texturen) på det tredimensionella föremålet. Procedur kallas för textur-mappning eller texturering. Den tvådimensionella bilden som representerar föremålets yta laddas upp till texturminnet på grafikkortet och när en pixel skall rastreras gör hårdvaran en texturuppslagning i minnet för att bestämma färgen på pixeln. Figur 2.3. Tvådimensionell texturmappning. Texturkoordinaterna (s i, t i) för ett hörn i en triangel (Belägen i objektrymden) används av grafikhårdvaran för att göra en uppslagning i en tvådimensionell texturbild. 1 Bump-mapping används som en metod för att rendera en ojämn yta på ett föremål utan att beskriva ytan med geometri. Detta görs genom en så kallad bump-map textur som ändrar ytnormalen och på detta sätt ljussätter föremålet så att illusionen av en ojämn yta simuleras. 9

KAPITEL 2. BAKGRUND För att kunna göra uppslagningen har varje hörn i triangeln i figur 2.3 en uppsättning texturkoordinater (s i, t i ) som definierar hörnets position i texturrymden. Koordinaterna kan antingen anges explicit i exempelvis ett 3D-modelleringsverktyg eller implicit genom att använda hörnets position. Själva mappningen görs genom att multiplicera texturkoordinaten med en 4 4-matris. När en pixel skall renderas görs en interpolation mellan triangelns tre hörn och hårdvaran använder den interpolerade texturkoordinaten för att göra en uppslagning i texturminnet och resultatet bestämmer pixelns slutgiltiga färg. Eventuellt kan resultatet även kombineras med andra tekniker för att fastställa färgen på pixeln. Figur 2.4. Texturmappning av en cylinder. Vänster: Tegelstens-textur och koordinater i texturrymden. Varje koordinat mappas till respektive hörn i cylindern. Mitten: Cylindermodell i ett 3D-modelleringsverktyg. Höger: Samma cylinder med tegel-texturen påklistrad. 2.1.4 Programmerbarhet i grafikprocessorer Sedan introduktionen av DirectX 8.0 har programmerare getts möjlighet att programmera grafikprocessorn. Denna möjlighet har gett grafikprogrammerare större möjligheter att skapa mer avancerade effekter än som varit möjligt med tidigare grafik-api:er. Skillnaden från den tidigare beskrivna grafikhårdvaran är införandet av programmerbara processorer som har till uppgift att bearbeta hörn och pixlar. Tidigare transformerades hörnen av grafikhårdvaran utan att programmeraren kunna styra processen. I dagens grafikprocessorer kan programmeraren skapa ett litet program, vertex-shader, som ersätter hörntransformationssteget i figur 2.1 (Sid 6). Programmeraren har på detta sätt större kontroll på hur hörnen transformeras och färgsätts. Vidare kan ett program även skapas som exekverar för varje pixel. Indata till detta program är den information som skickats från vertex-shadern och utdata är färgsatta pixlar som uppdaterar en bildpunkt på skärmen. Dessa små pixel-program kallas för pixel-shaders och ersätter texturering -och färgsättningssteget i figur 2.1. 10

2.1. GRAFIK HÅRDVARA I och med införandet av programmerbar hårdvara kan avancerade belysningmetoder implementeras. Per-pixel belysningsmodeller, Bump-mapping, Fresnel-effekter och renderingen av genomskinliga objekt är inte längre några svårigheter att rendera (Se referens [3] för en förklaring vad dessa effekter är). Som tidigare nämnts är en vertex-shaders huvudsakliga uppgift att ersätta hörntransformationssteget, det vill säga transformera ett hörns position i objektrymden till en position i skärmrymden. Förutom att transformera hörnets position kan färgoch ljussättning göras i en vertex-shader. För att exempelvis på ett enkelt och snabbt sätt rendera dimma kan ett hörns ursprungliga färg ändras beroende på dimmans färg och avståndet mellan hörnet och en presumtiv betraktare. Figur 2.5. Flödet mellan vertex-shader och pixel-shader för en programmerbar grafik-pipeline. Applikationen sänder hörn till en vertex-shader som även har tillgång till variabler som inte ändras ofta (uniforma variabler). Vertex-shadern transformerar hörnen och sänder rastrerade fragment till en pixel-shader som har till uppgift att göra färgberäkningar för varje pixel som skall uppdatera en bildpunkt på skärmen. Pixel-shadern har även tillgång till uniforma varibler. Ett hörns texturkoordinater kan även beräknas procedurellt eller ändras beroende på tid och hastighet. Speciellt är detta användbart vid renderingen av animerade texturer. Några av användningsområdena är animering av moln på ett himlavalv eller simuleringen av rörlig icke-homogen dimma. Se avsnitt 2.3.2 för beskrivning av dessa metoder. Utdata från en vertex-shader är information om just det aktuella hörnet. Programmeraren har stor frihet att specificera vilken information som skall skickas vidare till pixel-shadern. I många fall kan det av effektivitetsskäl vara bra att beräkna en del effekter per hörn och sedan skicka vidare informationen till pixel-shadern istället för att göra det för varje pixel. Skälet till detta är att antalet pixlar i en bild i de flesta fall är mycket större än antalet hörn, vilket i slutändan ger en ökad hastighet vid renderingen. En pixel-shader opererar på de fragment som kommer ut från rastreringssteget. Ett pixel-program körs för varje pixel och den information som vertex-shadern returnerade blir indata för pixel-shadern. För att göra en tvådimensionell texturaccess i minnet på grafikkortet används i HLSL (Microsofts språk för att programmera grafikkortet) funktionen tex2d(s,t), där s är en så kallad Sampler och t är 11

KAPITEL 2. BAKGRUND texturkoordinaten för aktuell pixel. En sampler är bilden som representerar själva texturen och kan definieras på en mängd olika sätt. Se referenser [3, 12, 13] för mer information om hur dessa samplers specificeras. 2.2 Ljusvolymer I detta avsnitt diskuteras principerna och teorin för att rendera ljusvolymer. Speciellt kommer metoder för att simulera sken runt ljuskällor och ljusvolymer producerade av exempelvis spotlights att diskuteras. 2.2.1 Grundläggande teori Interaktionen mellan ljus och partiklar är ett av det mest centrala fenomenet i datorgrafik (Hur ljus reflekteras mot en yta på föremål är ett specialfall av hur ljus interagerar med partiklar). Ljus som färdas genom atmosfären utsätts för olika sorters påverkan (Figur 2.6). En partikel i luften kan antingen absorbera ljus eller sprida det i en ny riktning. Vid absorption försvagas ljuset intensitet vilket leder till att den intensitet som når betraktaren minskar. Fenomenet dimma och volymmetriska ljuseffekter är ett resultat av att ett stort antal ljusstrålar sprids fram och tillbaka flertalet gånger tills strålen tillslut når en betraktare. I denna rapport antas dock att spridning endast kan ske en gång, vilket ofta ger en tillräcklig approximation för tillämpningsområdet datorspel. Utöver spridning mot betraktaren och absorption kan även partiklar sprida ljuset i riktning bort från betraktaren och därmed minska den intensitet som upplevs. Figur 2.6. Illustration av hur ljusstrålar interagerar med partiklar. Strålarna färdas i riktningen som indikeras av pilarna. Figur (a) visar strålar som inte påverkas av partiklar i luften. Vid absorption av ljuset (b) försvagas den intensitet som upplevs och vid spridning bort för betraktaren (c) minskar också ljusets styrka. Figur (c) visar spridning av ljuset i riktning mot betraktaren, vilket leder till en ökad intensitet i linje med betraktarriktningen. Bild från [4]. En punktljuskälla sänder ut ljusstrålar i alla riktningar. I figur 2.7 ses två stycken interaktioner med partiklar. Absorption av intensiteten sker för det ljus som sänds ut i riktning mot betraktaren (Figur 2.7a). Den intensitet som når betraktaren försvagas och beror på dimmans densitet och avståndet mellan betraktaren och 12

2.2. LJUSVOLYMER ljuskällan. Figur 2.7b illustrerar varför skenet runt en gatlykta uppstår. Ljusstrålar sprids mot partiklarna i luften och når vårat öga från olika riktningar. Varje partikel som orsakar en spridning i riktning mot betraktaren kan ses som en oändligt liten ljuskälla. Intensiteten för det ljus som spridits mot en partikel utsätts också för försvagning precis som den intensitet som sändes ut direkt mot betraktaren. Figur 2.7. Illustrationen visar hur ljus sprids mot partiklar och når vårat öga från olika riktningar och ger upphov till sken runt punktljuskällor. I (a) utsätts ljuset endast för absorption. Betraktaren upplever en ökad ljusintensitet då strålar sprids (b) mot partiklar. 2.2.2 Spridningsekvationen Även om ljusstrålar endast antas spridas en gång, är problemet att simulera ljusets interaktion med partiklar ett komplext problem. För att beräkna den ljusintensitet som når betraktaren i figur 2.8 måste intensitetsbidragen för alla spridningpunkter betraktas. Eftersom alla punkter mellan betraktaren och föremålet måste betraktas bildas en linjeintegral. En linjeintegral är en integral där funktionen som skall integreras evalueras längs en linje. Komplexiteten ökar också avsevärt om fler ljuskällor skall betraktas och det krävs en linjeintegral per ljuskälla för att simulera spridningen. Om endast en ljuskälla antas, utsätts betraktaren i figur 2.9 för den direktöverförda intensiteten I d och intensiteten I a som uppkommer på grund av spridningen. Den totala intensiteten I uttrycks då [17]. I = I d + I a Där det direktöverförda ljuset I d försvagas då det färdas sträckan D sv. Försvagningen beror på absorption och varierar exponentiellt beroende på den sträcka som ljuset färdats [19]. Utöver absorption avtar också ljuset enligt lagen om ljusets avtagande [20]. Detta ger att den intensitet som når fram till betraktaren uttrycks: I d = I 0 Dsv 2 e βdsv 13

KAPITEL 2. BAKGRUND Figur 2.8. Illustrerar komplexiteten i problemet. Intensitetsbidraget för alla spridningspunkter längs linjen AB måste betraktas, vilket leder till en komplicerad integral. Finns det dessutom fler ljuskällor ökar komplexiteten ytterligare. Där I 0 är den ursprungliga intensiteten som ljuskällan sänder ut och β är en konstant som beror på dimmans densitet. Det ljus som tillkommer på grund av en kollision vid punkten P i figur 2.9 utsätts också av försvagning då ljuset färdas sträckan d + x och ges av (Se [15, 17]) β k(α) I0 e βd d 2 e βx Eftersom alla punkter längs linjen mellan det närmsta föremålet och betraktaren bidrar till den totala intensiteten bildas linjeintegralen: I a = Dvp 0 β k(α) I0 e βd d 2 e βx dx (2.1) Figur 2.9. Figur som visar hur ljus sprids en gång och färdas sedan i riktning mot en betraktare. α är den vinkel som uppstår vid en spridningshändelse vid punkten P och γ är vinkeln mellan ljuskällan och betraktarriktningen. D sv är avståndet mellan ljuskälla och betraktare. D vp är avståndet mellan närmsta föremålet i scenen och betraktaren. d är avståndet mellan en spridningspunkt och ljuskällan. x är avståndet mellan en spridningspunkt och betraktaren. Bild från [17] 14

2.2. LJUSVOLYMER som alltså beskriver det ljus som tillkommer på grund av spridning längs betraktarriktningen. Funktionen k(α) beror på partikeln som orsakar spridningen och själva spridningsvinkeln. För partiklar som är väldigt små används ofta så kallad Rayleigh spridning och för större partiklar används Mie spridning (För mer information se [5]). Ekvation 2.1 kommer fortsättningsvis benämnas som spridningsekvationen. 2.2.3 Metoder för att rendera spridningsekvationen En vanlig metod för att evaluera spridningsekvationen är att röra sig längs betraktarlinjen i små steg och addera intensitetsbidraget för varje steg. Dock är denna metod alldeles för långsam för realtidsgrafik. I detta avsnitt betraktas metoder som i realtid kan approximera och rendera effekterna av ljusets interaktion med partiklar i luften. Först behandlas metoder som renderar det sken som uppstår på grund av att en punktformad ljuskälla befinner sig i dimma. I avsnitt 2.2.3 avhandlas metoder som bygger på geometri för att approximera en så kallad ljusvolym som uppstår då exempelvis en riktad ljuskälla är belägen i en dimmig miljö. Skenet runt punktformade ljuskällor För att på ett enkelt och effektivt sätt rendera det sken som uppstår runt en ljuskälla under en dimmig dag används i datorspel ofta en metod som benämns billboard [18]. På samma sätt som reklamskyltar utefter en motorväg är vända mot föraren fungerar billboard-tekniken genom att texturera ett plan som sedan orienteras så att den alltid är vänd mot betraktaren (Se figur 2.10). Denna metod används ofta i datorspel för att simulera skenet runt ljuskällor, renderingen av träd, explosioner och rök. Figur 2.10. Billboard-plan orienterad mot en betraktare. Planet roteras runt planets axel beroende på vektorn V och planets normal. Texturen som mappas på planet föreställer skenet runt gatlyktan. Trots att tekniken är enkel att implementera, fångar metoden det sken som bildas runt ljuskällan på ett imponerande sätt. Det slutgiltiga resultatet beror på kvaliteten på texturen som används och en mer detaljerad textur ger ett mer trovärdigt resultat. Tyvärr lider tekniken av en del problem. Framförallt yttrar sig detta då 15

KAPITEL 2. BAKGRUND Figur 2.11. Billboarden skär gatlyktan och geometrin för planet kan lätt uppfattas. andra föremål skär billboarden och betraktaren befinner sig nära föremålet. Planet som lätt kan ses i figur 2.11 skär geometrin för gatlyktan och resultatet är inte längre trovärdigt. Detta problem uppstår alltså då en billboard placeras i anslutning till annan geometri, som ofta är fallet då skenet runt en ljuskälla skall simuleras. Fördelen med denna metod är att den är väldigt snabb och beror inte på andra föremål i scenen. För att rendera billboarden behöver endast texturering och beräkningar för hur planet skall vara orienterat göras. En metod som inte lider av de artefakter som billboards dras med och ändå simulerar ett upplyst område runt en ljuskällan är en metod utvecklad av ATI Technologies Inc [7]. Precis som för billboards är denna metod inte baserad på en fysisk korrekt simulering av hur ljus sprids och absorberas mot partiklar. Metoden simulerar istället fenomenet genom att beräkna det minsta avståndet mellan ljuskällan och den linje som bildas mellan betraktaren och ett föremål. Figur 2.12. Illustration av ATIs metod för att simulera skenet runt en ljuskälla. För att bestämma den volymmetriska effekten som en ljuskälla ger upphov till beräknas vektorn U som bildas mellan den punkt (på vektorn V ) som ligger närmast ljuskällan. Det volymmetriska ljuset baseras på vektorn U s längd (Se figur 2.12). Denna vektor kan lätt beräknas i en pixel-shader genom kända matematiska beräkningar och förhållanden. I praktiken är de involverade vektorerna redan kända eftersom ljussättning av föremål oftast görs per pixel och ljuskälla. När väl U har beräknats 16

2.2. LJUSVOLYMER används en känd modell av hur ljus avtar beroende på avståndet från ljuskällan för att bestämma den volymmetriska effekten. Fördelen jämfört med billboards är att denna metod inte ger upphov till de problem som uppstår då billboard-planet placeras i anslutning till annan geometri. Anledningen till detta är att ingen geometri är inblandat för att beräkna U. Eftersom denna metod är beroende av bakomliggande föremål för att beräkna vektorn U måste alla beräkningar göras för alla synliga pixlar vilket kan vara ett problem. En grafikmotor innehåller ofta ett flertal vertex- och pixel-shaders som har ansvaret att rendera olika effekter, exempelvis bump-mapping eller reflektion. För att inkludera ATIs metod måste alltså beräkningarna göras för alla pixel-shaders som används, vilket i praktiken kan reducera renderingshastigheten för hela motorn. Figur 2.13. Exempel på ATIs metod för att rendera skenet runt en ljuskälla. Till vänster används DirectX modell för att beräkna hur ljus avtar beroende på avståndet från centrum och till höger används ATIs modell. Det visuella resultatet för skenet runt ljuskällan är trovärdigt, som figur 2.13 visar. Olika modeller för hur ljuset avtar beroende på sträckan som ljuset färdas ger olika visuella effekter. Exempelvis kan DirectX [10] modell användas som ger ett kraftigt upplyst centrum inuti ljuskällan. ATIs [7] modell ger ett mer dimmigt intryck, utan det kraftigt upplysta centrum. Vilken modell som används är en smaksak och kan lätt anpassas till egna visuella önskemål och krav. Geometribaserade ansatser för att rendera ljusvolymer Då en riktad ljuskälla placeras i en dimmig mörk miljö uppstår ofta en upplyst volym, en så kallad ljusvolym. Denna volym uppkommer på grund av att de riktade ljusstrålarna interagerar med partiklarna i luften. Många metoder [1][2][14] som 17

KAPITEL 2. BAKGRUND bygger på en volymbaserad ansatts har föreslagits för att simulera detta fenomen tillräckligt snabbt för att kunna användas i ett datorspel. Figur 2.14. Spridningsekvationen evalueras med hjälp av samplingsplan som är orienterade så att de är parallella med betraktaren. Idén med dessa metoder är de approximerar spridningsekvationen genom att rendera samplingsplan orienterade så att de är parallella med betraktaren som visas i figur 2.14. Intensiteten för det ljus som sprids i varje punkt på planet förberäknas och lagras i lookup-tabeller. Dessa tabeller används som texturer och mappas på samplingsplanen för att simulera den intensitet som uppstod på grund av spridningen. Fördelen med dessa metoder är att de drar nytta av hårdvarans accelererade möjligheter för texturering. Däremot beror det spridda ljuset på många faktorer, vilket ger att texturerna blir flerdimensionella och detta leder till att texturen tar upp en stor del av grafikkortets texturminne. Vidare kan artefakter uppstå i den renderade bilden på grund av samplingfel. Dessa artefakter minskas dock i och med införandet av delplan [2] som har till uppgift att sampla de delar av spridningsekvationen som kräver högre samplingsfrekvens. Problemet med att 3D-texturerna kräver en stor del av texturminnet löser Mitchell [14] genom att projicera en tvådimensionell ljustextur (light-map) på samplingsplanen. Denna ljustextur har ingenting med övriga scenen att göra, det vill säga ingen förberäkning av intensiteter för ljuskällan krävs, vilket betyder att texturen med fördel kan skapas av en grafiker. Vidare definieras ett ljusfrustum som har en position, riktning, uppvektor samt två klipplan som begränsar volymen. Ett exempel på detta frustum ses i figur 2.15 där samplingsplanen även har klippts vid kanterna på frustumet för att minska antalet pixlar som måste renderas. För att ytterligare minska antalet pixlar kan även de samplingsplan som befinner sig under världens grundplan klippas bort. Fördelen med att använda sig av ljustexturer för att uppskatta spridningen av ljuset är att olika former på ljusvolymen kan erhållas. Exempelvis kan en stjärnliknande form fås genom att använda sig av en ljustextur som är formad som en stjärna. Mitchell inkluderar även skuggor bakom föremål som eventuellt befinner sig inuti ljusfrustumet. När ljusvolymen skall renderas, projice- 18

2.2. LJUSVOLYMER ras en shadow-map 2 på samplingsplanen och ljuskällans djup kan sedan jämföras med shadow-map texturen för att ta reda på om en pixel befinner sig i skugga. Vidare simuleras icke homogen dimma inuti ljusvolymen genom att animera så kallade noise-texturer över ytan på samplingsplanen. Mer om animerade noise-texturer i avsnitt 2.3.2. Mitchell s metod ger goda visuella resultat och är tillräckligt snabb för att köra i realtid. Den stora fördelen är möjligheten att skapa olika former och färger för ljusvolymen genom att använda sig av olika ljustexturer. Det är också enkelt att inkludera skuggor inuti frustumet genom kända skugg tekniker. Däremot lider metoden av andra problem. Exempelvis måste grafikkortet ha ett högt fillrate-värde, det vill säga klara av att rendera många pixlar varje sekund. Även skuggeffekterna kan kräva mycket av hårdvaran, speciellt om skuggorna måste vara dynamiska. Zhu et al. [24] föreslår en metod som också använder sig av polygongeometri. Skillnaden är att denna geometri inte består i samplingsplan utan av en faktisk modell som är tänkt att approximera ljusvolymen. Metoden fungerar genom att rendera djupet för bak- respektive framsida av denna geometri. Dessa värden lagras i texturer för att senare beräkna vart betraktarvektorn skär modellen för ljusvolymen. Nästa steg är att rendera hela scenen och i en pixel-shader använda de två texturerna för att ta reda på om spridningsekvationen verkligen behöver evalueras. Zhu et al. evaluerar denna ekvation genom att sampla integralen längs betraktarvektorn, med start och slut där vektorn skär ljusvolymen. 2 Shadow-mapping tekniken fungerar genom att rendera scenen från en ljuskällas synvinkel. Djupet för föremålen i scenen lagras i en textur som sparas i grafikkortets texturminne. Denna textur kallas för en shadow-map Figur 2.15. Samplingsplan orienterade parallellt med betraktaren. Bortre och främre klipplanen begränsar ljusvolymen. Samplingsplanen är klippta vid kanterna på det frustum som definierar ljusvolymen. 19

KAPITEL 2. BAKGRUND 2.3 Dimmiga miljöer Detta avsnitt behandlar teori och metoder för att rendera allmänt dimmiga miljöer där specifika ljuskällor inte interagerar med dimmans partiklar. I datorgrafikens värld är det i många fall viktigt, speciellt för utomhusmiljöer att inkludera de effekter som uppstår på grund av dimma. 3D-miljöer utan dimma kan riskera att upplevas orealistiska i och med att färgerna i scenen blir alldeles för klara och kontrasten mellan föremål blir för skarpa. Föremål som finns i en miljö som innehåller dimma tappar kontrast och konturerna blir otydliga. Effekten blir att miljön uppfattas som dunkel och suddig. Ett exempel på detta fenomen kan ses i figur 2.16. I den vänstra bilden ses exempelvis bergen i bakgrunden tydligt medans i den högra är bergen helt täckt av dimma. Notera också att färgerna på träden i förgrunden skiljer sig markant för de två bilderna. I avsnitt 2.3.1 beskrivs en metod som gör antagandet att dimman har konstant densitet och finns närvarande i hela miljön. Det är alltså samma mängd dimma vart man än befinner sig i världen. Metoden implementeras av OpenGL [16] och DirectX [11] och fungerar i kort genom att blanda föremålens färg med dimmans färg beroende på hur långt bort föremålet befinner sig från betraktaren. I verkligheten består dimma av olika lager som påverkas av vind och turbulens. Detta leder till ett komplext fenomen som den enkla metoden som beskrivs i [16] inte tar hänsyn till. I avsnitt 2.3.2 presenteras metoder för att simulera icke homogen dimma i realtid. Figur 2.16. Vänster: En klar dag. Färgerna för bakgrund och objekt är skarpa. Höger: Under en dimmig dag reduceras sikten och färgerna mattas ut. Bilder från [21] 2.3.1 OpenGL dimma OpenGLs metod [16] för att rendera konstant dimma är snabb och enkel att implementera. Längs en linje mellan en betraktare och ett föremål sprids eller absorberas 20

2.3. DIMMIGA MILJÖER ljusets intensitet och den mängd intensitet som annars skulle nå fram till betraktaren försvagas. Partiklarnas densitet antas vara konstant och intensiteten för det ljus som färdas genom dimman avtar antingen linjärt eller exponentiellt beroende på sträckan som ljuset färdats. Både absorption och spridning sker då en ljusstråle kolliderar med en partikel. Om endast absorption skulle inträffa skulle avlägsna objekt bli helt svarta. Men eftersom solen sänder ut ljusstrålar som sprids mot partiklar och fortsätter i riktning mot betraktaren ökar den försvagade intensiteten. Båda dessa effekter, absorption och spridningen bestämmer utseendet på dimman. Ljus som har färdats en lång sträcka genom dimma kommer alltså att ha ett stort bidrag av det sprida ljusets intensitet och bakgrunden kommer att bli mörkare. Figur 2.17. Skärmdumpar på en scen renderad med OpenGL-metoden. Vänster: En scen renderad utan dimma. Höger: Samma scen renderad med dimma. Bilder från [3]. OpenGL implementerar dimma genom att för varje inkommande pixel blanda dimmans färg C dimma med pixelns färg C in baserat på en absorptionsfaktor (f): C ut = fc in + (1 f)c dimma (2.2) Där termen fc in är absorption av den inkommande pixelns färgintensitet och (1 f)c dimma är den färgintensitet som tillkommer på grund av ljus som har spridits i riktning mot betraktaren. Faktorn f beror på dimmans densitet samt avståndet till betraktaren och det är välkänt [15] att intensiteten varierar exponentiellt beroende på avståndet d från betraktaren: f = e d 0 σ(t)dt Om konstant densitet σ för dimman antas, förenklas ekvaktionen: f = e d σ 21

KAPITEL 2. BAKGRUND Vilket är den modell som OpenGL använder sig av för att implementera renderingen av dimma. Utöver denna typ av absorption stödjs också linjär och kvadratiskexponentiell försvagning (Se figur 2.18). Se även figur 2.17 för en datorgenererad scen renderad med OpenGLs metod. 100 Linjär e (d*σ)2 e d*σ 0 Figur 2.18. Grafen visar procenten av den ursprungliga färgen C in för ett föremål som funktion av avståndet mellan föremålet och betraktaren. Vid inget avstånd ändras inte föremålets. Längre avstånd resulterar i att föremålet förlorar större delen av sin ursprungliga färg. Bild från [22]. 2.3.2 Icke homogen dimma I verkligheten består dimma av olika lager som påverkas av vind och turbulens. Detta leder till ett komplext fenomen som den enkla metoden beskriven i föregående avsnitt inte tar hänsyn till. Figur 2.19. Vänster: Noise-textur som används för att rendera moln på ett plan. Texturen är sömlös och animeras i två riktningar över ytan på planet som representerar himmelen. Höger: Skärmdump från ATI s implementation av metoden [6]. 22

2.3. DIMMIGA MILJÖER För att simulera icke homogena material på ett billigt sätt används ofta så kallde noise-texturer. En sådan textur representerar oregelbundenheten i ett material och kan med fördel användas till att rendera moln och icke homogen dimma. ATI [6] använder exempelvis den tvådimensionella sömlösa texturen i figur 2.19 för att rendera olika molnlager. Idén är att representera molntäcket på himlen med ett plan och sedan animera textureringen för planet. Detta kan åstadkommas genom att texturkoordinaterna för planet modifieras beroende på tid och en förutbestämd hastighet. För varje hörn på planet genereras två stycken texturkoordinater genom att addera en animationsvariabel: NoiseTexCoord1 = TexCoord + Animation.x NoiseTexCoord2 = TexCoord + Animation.y Där NoiseTexCoord1 och NoiseTexCoord2 är de två genererade koordinaterna och TexCoord är den ursprungliga koordinaten. Animation är programmets förlupna tid multiplicerat med en förutbestämd hastighet i två riktingar. Genereringen av noisekoordinaterna kan med fördel göras i en vertex-shader och sedan skickas vidare till pixel-shadern som gör två stycken texturuppslagningar i molntexturen. De två värdena från uppslagningarna interpoleras linjärt för att slutligen blandas samman med färgen från himlens bakgrundsfärg. Denna metod ger en illusion av att två stycken molnlager färdas i x respektive y riktningen. Zdrojewska [23] har utvecklat en algoritm som simulerar icke homogen dimma i realtid. Algoritmen baseras på Perlin-noise och exekveras på grafikkortets hårdvara. 1 0 0 Figur 2.20. Endimensionell noise-funktion. Ett slumpmässigt tal mellan 1 och 0 tilldelas för varje punkt på x-axeln. Eftersom dimma består av partiklar med olika densitet som påverkas av vinden upplevs fenomenet slumpmässigt och dimman tar ofta oregelbundna former vid olika tidpunkter. På grund av denna iakttagelse använder Zdrojewska slumpmässiga noise funktioner. En sådan funktion är i huvudsak en funktion som genererar slumpmässiga tal, där indata kan vara ett tal eller flerdimensionella koordinater och utdata är ett slumpmässigt värde baserat på indata. Skickas samma indata två 23

KAPITEL 2. BAKGRUND gånger till funktionen skall alltid samma värde returneras. I figur 2.20 ses ett exempel på en endimensionell noise-funktion där ett slumptal mellan 0 och 1 genererats för varje punkt på X-axeln. Genom att interpolera värdena i grafen kan en kontinuerlig funktion defineras som kan ta ett decimaltal som indata (Se figur 2.21) och returnera ett slumpvärde. Idén för att simulera icke homogen dimma är att skicka in en koordinat från den tredimensionella miljön och erhålla dimmans densitet i just denna koordinat. 1 0 0 Figur 2.21. Interpolerad noise-funktion som kan ta decimaltal som indata. Amplituden är skillnaden mellan högsta och minsta värdet funktionen kan ta. Våglängden är avståndet mellan två punkter i figuren och frekvensen definieras som 1/våglängden. Eftersom de genererade noise-funktionerna har hög frekvens (Liten våglängd) ändras det genererade värdet för närliggande positioner snabbt vilket inte lämpar sig särskilt bra för dimma eftersom densiteten för partiklarna inte ändras lika snabbt. För att få en jämnare noise-funktion med lägre frekvens tas medelvärdet av den aktuella positionen och omkringliggande positioners värden. Den heldragna kurvan i figur 2.22 är en utjämnad variant av den mer högfrekventa kurvan och den nya funktionens frekvensen har ungefär halverats. De höga värden som uppkommer för vissa positioner har även jämnats ut. 1 0 0 Figur 2.22. Den heldragna kurvan illustrerar en utjämnad noise-funktion som konstrueras genom att ta medelvärdet av aktuell position och de omkringliggande positionerna. 24

2.3. DIMMIGA MILJÖER Idén med att använda noise för att simulera dimma är att addera noise-funktioner med olika frekvenser och amplituder enligt Perlin s turbulensfunktion. turbulence(x) = N 1 i=0 noise i (x) 2 i (2.3) Där noise i (x) representerar dimmans densitet vid position x. Varje noise-funktion som adderas kallas för en oktav, vilket förklaras med att varje funktion som adderas har dubbel frekvens jämfört med den föregående. Antalet N oktaver som adderas varierar för olika ändamål, men för att rendera en bild på skärmen räcker det med fyra. Detta eftersom det förmodligen inte finns tillräckligt med pixlar för att avbilda de små detaljerna i en väldigt högfrekvent noise-funktion. Bilderna i figur 2.23 representerar de olika oktaverna som texturer i två dimensioner. Figur 2.23. Tvådimensionella Perlin noise-texturer. Om den sista texturen, noise 3 (x), studeras ses lätt att mer högfrekventa noise-texturer inte behövs på grund av att en skärm ändå inte har tillräcklig hög upplösning för att klara av att visa den. Bilder från [23]. Den metod som Zdrojewska renderar icke homogen dimma enligt följande tre steg: 25

KAPITEL 2. BAKGRUND 1. Generera texturerna noise 0 (x), noise 1 (x), noise 2 (x) och noise 3 (x) i ett förberäkningssteg 2. Beräkna faktorn f för den icke homogena dimman 3. Blanda föremålens färg med dimmans färg enligt ekvation 2.2 (Sid 21) I första steg skapas de fyra noise-texturerna som användas för att skapa turbulance funktionen. Texturerna är i gråskala och representerar noise-funktioner som har olika frekvenser. Exempelvis har den första texturen (noise 0 (x)) låg frekvens, vilket kan ses genom att färgerna ändras långsamt. Ökas frekvensen ändras också färgen snabbare och varje textur har den dubbla frekvensen jämfört med den föregående. För att skapa Perlin s turbulensfunktion adderas de skapade texturerna enligt ekvation 2.3 vilket resulterar i texturen som kan ses i figur 2.24. Figur 2.24. Perlin s turbulenstextur som fås genom att addera de fyra noisetexturerna i figur 2.23 enligt ekvation 2.3. Från [23]. I det andra steget bestäms faktorn f genom att inkludera turbulensen i beräkningarna och ges då istället av (Jämför avsnitt 2.3.1) f = e (d σ turbulance(x)) I sista steget blandas föremålets ursprungliga färg med dimmans färg enligt ekvation 2.2, dock med det nya värdet för funktionen f. Metoden implementeras av Zdrojewska. Noise-texturerna skapas i ett förberäkningssteg och defineras i tre dimensioner. För att åstadkomma turbulens ändras den ursprungliga texturkoordinaten (ett hörns position) med en animationsvektor baserat på förlupen tid och hastighet: NoiseTexCoords0 = Coord + Animation.x;... NoiseTexCoords3 = Coord + Animation.w; 26

2.3. DIMMIGA MILJÖER Dessa koordinater skickas sedan vidare till en pixel-shader som beräknar Perlins turbulensfunktion enligt ekvation 2.3, där noise i (x) motsvaras av en texturuppslagning för respektive texturkoordinat och noise-oktav. float k0 = tex3d(noisetex0, NoiseTexCoords0);... float k3 = tex3d(noisetex3, NoiseTexCoords3); float Turbulence = (k0 + k1/2.0f + k2/4.0f + k3/8.0f); Där NoiseTex0 till NoiseTex3 motsvarar texturerna i figur 2.23. Slutligen beräknas som bekant faktorn f för dimman och färgerna blandas enligt ekvation 2.2. 27

Kapitel 3 Arbetet I detta kapitel diskuteras två metoder för att rendera de effekter som uppstår då ljus påverkas av partiklar i luften. Första metoden simulerar det sken som uppstår runt en isotropisk punktljuskälla under en dimmig dag. Ingen geometri är inblandad vilket resulterar i att inga artefakter uppstår då andra förmål i en miljö befinner sig i närheten av skenet som i fallet för billboards. Metoden har utvecklats av Sun et al. och presenteras i referens [17]. För att approximera effekterna som uppstår då ljusstrålar från en riktad ljuskälla interagerar med dimma definieras en konmodell bestående av polygoner. Modellen renderas med hjälp av shaders och effekterna åstadkommes i tre olika steg: Uppskattning av vertikalt- respektive horisontellt ljusavfall samt simulering av icke homogen dimma. Metoden presenteras i avsnitt 3.2 och är framtagen efter samtal med John Isidoro [8] från ATI Technologies Inc. För båda metoderna kommer fördelar och nackdelar beträffande en implementation i en grafikmotor att diskuteras. 3.1 Isotropisk punktljuskälla För att rendera skenet runt en punktljuskälla i dimma beskriver Sun et al. [17] en metod som approximerar fenomenet fysikaliskt korrekt och samtidigt har realtidsprestanda. Som bekant uppstår skenet på grund av att ljus sprids mot partiklar i luften och når betraktaren från olika riktningar. Tillskottet av ljusintensitet vid en kollision beskrivs av spridningsekvationen i avsnitt 2.2.2 och består av en linjeintegral längs betraktarriktningen. Sun et al. reducerar denna komplicerade integral till en kombination av analytiska funktioner som beror på miljöns fysiska parametrar och två stycken texturuppslagningar vilket ger att spridningsekvationen inte behöver evalueras numeriskt. Kommer här beskriva kort hur reduceringen gjorts. För en mer utförlig härledning 29

KAPITEL 3. ARBETET Figur 3.1. α är den vinkel som uppstår vid en spridningshändelse vid punkten P och γ är vinkeln mellan ljuskällan och betraktarriktningen. D sv är avståndet mellan ljuskälla och betraktare. D vp är avståndet mellan närmsta föremålet i scenen och betraktaren. d är avståndet mellan en spridningspunkt och ljuskällan. x är avståndet mellan en spridningspunkt och betraktaren. Bild från [17] se referens [17]. Se även figur 3.1 för förklaring till de symboler som används i detta avsnitt. För att göra beräkningarna möjliga antas att ljuskällor är isotropiska, det vill säga samma intensitet sändes ut likformigt i alla riktningar. Vidare antas att dimmans densitet är konstant vilket gör det möjligt att reducera komplexiteten för spridningsekvationen och Sun et al. visar att den intensitet som tillkommer på grund av ljusets spridning kan förenklas till: π 4 I a = A + 1 2 arctan T vp Tsv cos γ Tsv sin γ 0 exp ( A γ 1 tan ξ)dξ (3.1) 2 Där T = βd är det optiska djupet för respektive avstånd. Det optiska djupet beror på dimmans spridningskoefficient β och det avstånd D som ljuset färdats. A 0 och A 1 är två funktioner som kan evalueras analytisk och beror på de fysiska egenskaperna för miljön: A 0 = β2 I 0 e T sv cos γ 2πT sv sin γ A 1 = T sv sin γ Fastän ekvation 3.1 ser ut att vara mer komplicerad än det ursprungliga uttrycket för I a är den egentligen i sin enklaste form. Uttrycken för A 0 och A 1 består av enkla analytiska beräkningar som snabbt kan evalueras av grafikhårdvaran eftersom de endast beror på vart betraktaren är belägen (D sv och γ) och vilken spridningskoefficient dimman har (β). Vidare betraktas funktionen A 1 i integranden som en konstant eftersom integralen endast skall lösas med avseende på ξ. För att kunna bryta ut integranden i uttrycket 3.1 definierar Sun et al. en funktion F (u, v) som beskriver de viktigaste egenskaperna för integranden. Det är denna 30

3.1. ISOTROPISK PUNKTLJUSKÄLLA Figur 3.2. 3D-graf för funktionen F (u, v). Eftersom grafen inte har något konstigt beteende kan den lagras som en 2D-textur. Figur från [17]. definition som gör att det beräkningskrävande uttrycket för spridningen av ljus mot partiklar kan approximeras med två stycken texturuppslagningar. F (u, v) = v 0 exp ( u tan ξ)dξ Denna funktion har heller inget enkelt analytiskt uttryck som snabbt kan evalueras. Däremot är det en tvådimensionell funktion som inte har något konstigt beteende och därför kan lagras som en 2D-textur. Funktion är helt oberoende av de fysiska egenskaperna av problemet och behöver således endast beräknas en gång. Ekvationen 3.1 kan nu skrivas om till (Eftersom F (u, v) är primitiv funktion till exp ( u tan ξ) på intervallet [0, v]): ( I a = A 0 F (A 1, π 4 + 1 2 arctant vp T sv cosγ ) F (A 1, γ ) T sv sinγ 2 ) (3.2) Där F (A 1, ) motsvarar en texturuppslagning i den förberäknade 2D-texturen. A 0, A 1 och övriga uttryck måste alltså beräknas för varje pixel i en pixel-shader. 3.1.1 Implementation Metoden har implementerats i DirectX och HLSL på ett NVidia GeForce 7800 GT gratfikkort. En pixel-shader har ansvaret att beräkna de fysiska parametrarna: D sv, D vp och γ som krävs för evaluera ekvation 3.2. Detta är enkla uttryck som grafikhårdvaran snabbt kan beräkna för varje pixel i scenen. Därefter beräknas A 0, A 1 och de två texturkoordinaterna som används till att göra uppslagningen i texturen. Slutligen bestäms intensiteten I a genom att använda ekvation 3.2. Den tvådimensionella texturen för funktionen F (u, v) förberäknas en gång och noggrannheten i metoden beror på vilken upplösning texturen har. Sun et al. visar att en 31

KAPITEL 3. ARBETET Figur 3.3. Funktionen F (u, v) som en tvådimensionell textur. Värdena för funktionen lagras med flyttalsprecision i den röda kanalen, därav den röda färgen i texturen. 64 64 textur för F (u, v) ger ett totalt fel på mindre än 2%, vilket är mer än tillräckligt för att erhålla ett gott visuellt resultat vid renderingen. Implementation skapar texturen i ett förberäkningssteg med hjälp av Sun et al. förberäknade 2D-tabell för funktionen F (u, v). 2D-tabellen lagras i den röda kanalen på en flyttals-textur. DirectX [9] ger möjligheten att specificera olika format som beskriver hur varje texel-värde i texturen skall lagras och i detta fall användes formatet D3DFMT_R16F för att skapa texturen i figur 3.3. 3.1.2 Begränsningar i metoden Ett problem med denna metod då det gäller att implementera den i ett datorspel är att beräkningarna för I a måste göras för alla pixlar som passerar till den pixelshader som har ansvar att rendera hela miljön. Metoden är beroende av de bakomliggande föremålen för att kunna bestämma hur mycket ljus som sprids i riktning mot betraktaren. Finns det dessutom fler ljuskällor ökar som bekant komplexiteten ytterligare. En grafikmotor i ett datorspel har ofta många shaders vars uppgifter varierar, exempelvis kan en shader rendera bump-mapping och en annan rendera reflektion för något material i miljön. För att implementera Suns metod är man då tvungen att inkludera beräkningarna för I a i alla shaders. Även fast metoden i sig är snabb kan detta resultera i resurskrävande beräkningar som tar för mycket kraft från de övriga effekterna. 3.2 Volym från en riktad ljuskälla För att kunna inkludera effekter i datorspel som uppstår på grund av riktade ljuskällor som ger upphov till en ljusvolym liknande den i figur 3.4 krävs en effektiv algoritm som inte tar för mycket processorkraft från den övriga renderingen. Istället för att simulera en beräkningskrävande modell av hur ljus sprids och absorberas approximeras effekten genom att definiera en geometrisk konmodell bestående 32

3.2. VOLYM FRÅN EN RIKTAD LJUSKÄLLA Figur 3.4. Exempel på upplysta ljusvolymer. Observera suddigheten vid ljusvolymernas silhuetter. I de två vänstra bilderna kan även olika skikt av dimma (och rök) ses. I bilden längst till höger ses också att ljuset avtar i rikting ut från ljuskällan. av polygoner och sedan rendera den i tre olika steg. Första steget uppskattar hur ljusintensiteten avtar från toppen till botten av konenen. Det andra steget renderar den suddiga kant som uppkommer för riktade ljuskällor och slutligen simuleras de olika skikt som uppstår då dimma färdas genom luften. Stegen renderas med hjälp av vertex och pixel-shaders och har implementerats med hjälp av HLSL och DirectX. 3.2.1 Implementation Metoden approximerar ljusets spridning och approximation på två sätt. Det vertikala ljuset som utsändes från ljuskällan beräknas genom att definiera y-texturkoordinaten på konen att gå från [0... 1] med värdet 0 högst upp på konen och 1 längst ner. Eftersom texturkoordinaterna interpoleras då de skickas mellan vertex-shadern och pixel-shadern kan detta värde användas för att uppskatta hur ljuset avtar beroende på avståndet från toppen av konen, där själva ljuskällan antas vara belägen. En bra approximation som ger en gott visuellt resultat för hur mycket ljus som når en specifik punkt på konen är att använda det interpolerade värdet för y-komponenten i kvadrat. Så det vertikala ljusbidraget uttrycks: I v = T 2 y Där T y är y-värdet för texturkoordinaten som alltså löper mellan 0 och 1 med start vid konens topp och I v representerar ljuset som når en viss punkt på konen. Vid konens topp evalueras exempelvis I v till 0, vilket betyder att inget ljus har absorberats eller spridits. Alternativt kan det vertikala ljuset också beskrivas med hjälp av en endimensionell textur. Tanken är att göra en uppslagning i denna textur med y-texturkoordinaten 33

KAPITEL 3. ARBETET Figur 3.5. Endimensionell textur för att uppskatta hur ljuset avtar vertikalt längs ljuskonen. Svart färg representeras av att allt ljus har spridits eller absorberats och vit färg ger således att inget ljus har avtagit. och på detta sätt uppskatta hur ljuset avtar med avståndet från toppen av konen. Själva texturen är endast en gradient och kan med fördel läggas i en kanal i texturen. Fördelen med detta alternativ är att artister och modellerare som skapar all geometri i ett datorspel inte behöver tänka på att sätta tetxurkoordinater på det speciella sätt som är beskrivet ovan utan behöver endast göra en cylinder-mapping av konen och sedan använda den endimensionella gradient-texturen för att uppskatta hur ljuset avtar vertikalt. Figur 3.6. Illustration av de problem som uppstår då enbart normal och betraktarvektorn jämförs. Vänster: Betraktaren befinner sig direkt framför konen och ger ett godkänt visuellt resultat. Höger: betraktaren är belägen snett under konen och ytan börjar bli osynlig. Silhuetten för en upplyst volym tenderar i de flesta fall att bli suddiga. Detta beror på att intensiteten inte är konstant över hela den upplysta volymen och avståndet som ljuset färdas genom dimman. Ljus som färdas genom dimma har större sannolikhet att interagera med partiklar om sträckan är större. För att simulera denna suddighet vid kanterna på konen används en teknik som är en variant på en känd metod [3] som finner de pixlar som ligger på konens silhuett. Dessa pixlar hittas genom att jämföra vinkeln mellan normalen (N) vid en punkt på ytan och den vektor som bildas mellan betraktaren och punkten (V ). Skalärprodukten N V ger ett mått på hur mycket av ytan som betraktaren kan se. En punkt är synlig om N V är positiv och ej synlig om den är negativ. För punkter på eller nära silhuetten ger skalärprodukten ett värde nära 0 och representerar övergången från ej synlig till synlig ljusvolym. Metoden ger ett bra resultat om betraktaren befinner sig direkt 34

3.2. VOLYM FRÅN EN RIKTAD LJUSKÄLLA framför konen. Dock uppstår problem om betraktaren är belägen snett under konen eftersom ytan då börjar bli osynlig vilket inte simulerar det verkliga fenomenet på ett korrekt sätt. Figur 3.7. Tangent-space för några hörn på ljuskonen. Den röda vektorn är punktens normal som pekar vinkelrät ut från ytan på konen. Grön vektor är binormal för punkten och den blåa vektorn är tangent. Tangenten bildar ringar runt konen. Alla vektorer är vinkelräta mot varandra. För att lösa ovanstående problem används en teknik som transformerar betraktarvektorn till ett koordinatsystem som definieras av en punkts normal, tangent och binormal (Se figur 3.7). Detta koordinatsystem kallas som bekant för tangent-space och i fallet för ljuskonen definieras en punkts normal att peka vinkelrätt ut från ytan medans tangenten bildar ringar runt ytan på konen. Binormalen är den vektor som pekar rakt ner längs ytan på konen och är vinkelrätt mot både normalen och tangenten. Den transformerad betrakarvektorn projiceras sedan ned på planet som definieras av ytpunktens normal och tangent. Slutligen används z-värdet på den projicerade betraktarvektorn för att approximera hur ljuset avtar mot kanterna på konen. Detta gör att de pixlar som befinner sig nära eller på silhuetten har ett z- värdet som ät litet eller 0, medan pixlar som befinner sig direkt framför betraktaren har större z-värde (Se figur 3.8). Figur 3.8. (a): Pixel som befinner sig på konens silhuett har ett Normal-Tangentplan som inte syns och har således z-värde 0. (b): Pixel som befinner sig direkt framför betraktaren får ett större z-värde. Det beräknade z-värdet kan antingen kvadreras eller exponentieras för att bestämma hur genomskinlig varje pixel skall vara. Tangent-space för varje hörn har skapats 35

KAPITEL 3. ARBETET då ljuskonen exporterades från ett 3D-modelleringsprogram och för att få texturkoordinaterna rätt har konen en cylinder-mappning (Se figur 2.4 på sidan 10). Dock har y-komponenten för texturkoordinaterna ändrats, så att det går från 0 vid toppen av konen till 1 vid botten. För att ytterligare öka realismen animeras en textur som är tänkt att representera dimma i olika skikt över ytan på konen. Detta ger illusionen av att icke homogen dimma passerar genom den upplysta volymen. Med fördel kan texturens olika färgkanaler (RGB) användas för att undvika den rullning som ibland kan inträffa då en textur animeras över en böjd yta. Exempelvis kan den röda kanalen i texturen användas för att animeras ett lager i x-led. Ett annat lager kan sedan använda den blåa kanalen för att animera lagret i y-led. Vidare är det också möjligt att animera de olika lagren olika fort vilket ökar realismen eftersom betraktaren då har svårare att uppfatta de upprepningarna som uppstår. Slutligen kombineras de tre stegen genom att multiplicera värdena och använda detta för att bestämma hur genomskinlig konen skall vara för en specifik pixel. Det slutgiltiga resultatet tillsammans med illustrationer för respektive steg kan ses i figur 3.10. 3.2.2 Begränsningar i metoden Metoden lider av en både visuella och tekniska begränsningar. Den största tekniska begränsningen är att metoden endast fungerar med en cylindrisk kon. Har den riktade ljuskällan exempelvis en annan form, exempelvis ett lysrör fungerar inte metoden eftersom approximationen för hur ljuset avtar vid kanterna på konen blir felaktig. Figur 3.9. Problem uppstår då ett föremål skär ljuskonen. Konens geometri kan lätt ses på grund av den skarpa kanten. Andra nackdelar som metoden lider av är att själva konen måste vara relativt detaljerad för att undvika att geometrin inte ska se kantig ut. I figur 3.10 delades konen 100 gånger vertikalt. För att minimera texturdistorsion vid interpolation av 36

3.2. VOLYM FRÅN EN RIKTAD LJUSKÄLLA texturkoordinaterna över ytan på konen kan det också vara en fördel om konen även delas horisontellt. Det räcker med 3 4 horisontella indelningar för att minimera distorsionen. Detaljrikedomen för konen kan självklart variera beroende på avståndet till betraktaren. Vidare tas inte hänsyn till om objekt skär ljusvolymen. Eftersom metoden använder alpha-kanalen för att bestämma hur genomskinlig en specifik pixel skall vara ger detta att geometrin för volymen lätt kan ses då föremål skär den. Kanten mellan den del av föremålet som inte befinner sig inuti volymen och den som gör det blir skarp, men förmodligen är detta inte ett stort problem i datorspel eftersom konerna oftast är tänkta att placeras en bit ovanför marken där föremål sällan befinner sig. 37

KAPITEL 3. ARBETET Figur 3.10. Illustration av de olika stegen för att rendera ljuskonen. (a) Resultatet efter att det vertikala ljuset har beräknats. (b) Resultatet för beräkningarna vid konens silhuett. (c) Animering av textur över ytan på konen. Texturen animeras i olika riktningar och hastigheter för att simulera olika skikt av dimma. (d) Det slutgiltiga resultatet då ovanstående steg kombinerats. 38

Kapitel 4 Resultat och slutsatser Metoden som simulerar skenet runt en punktljuskälla har en del egenskaper som talar emot den då det kommer till att inkludera den i ett datorspel. Som tidigare nämnts behöver beräkningarna evalueras för varje synlig pixel i scenen. I detta avseende är Billboard-metoden att föredra, eftersom en egen shader kan specificeras för att endast rendera skenet. Tyvärr dras denna metod också med problem. Som bekant bildas artefakter då planet som utgör själv billboarden är placerad nära ett föremål, i detta fall geometrin för exempelvis en lyktstolpe. Planets polygoner kan lätt uppfattas och resultatet är inte trovärdigt. I figur 2.11 från avsnittet som behandlar billboards (Avsnitt 2.2.3) kan ett exempel på detta problem ses. Eftersom Sun s [17] metod körs för varje pixel uppstår inte dessa problem och ljuskällor kan med fördel placeras i anslutning till andra föremål. Exempelvis kan en ljuskälla placeras nära eller i anslutning till en vägg utan problem. Se figur 4.1 för skillnaden mellan metoderna för en ljuskälla som placerats intill en vägg. Figur 4.1. Illustrerar skillnaden mellan Sun s metod (a) för att approximera skenet och en enkel billboard-effekt (b) då en ljuskälla placeras intill en vägg. Den vanligaste metoden för att simulera skenet är helt klart billboard-metoden. 39

KAPITEL 4. RESULTAT OCH SLUTSATSER Figur 4.2. Storleken på skenet runt gatlyktan bestäms även av avståndet till betraktaren, precis som spridningsekvationen beskriver. Detta på grund av att metoden är prestandamässigt snabbare än andra metoder. Att inkludera billboards i en grafikmotor är som bekant väldigt enkelt. Endast en shader som texturerar och roterar planet krävs. Vidare behöver inte miljöns övriga föremål betraktas vilket ofta är attraktivt då det kommer till att välja metod. Anledningen till att dagens datorspel överhängande använder billboards är att andra delar av spelet kräver mycket kraft från hårdvaran och skenet runt ljuskällor sätts i andra hand, vilket är förståeligt eftersom exempelvis AI och andra delar är betydligt viktigare. Om resultatet, med tanke på det artefakter som uppstår då planet skär ett föremål, är acceptabelt är billboard-metoden klart att föredra. För mer realistiska renderingar och simuleringar, anser jag, att antingen Suns eller ATIs (Se avsnitt 2.2.3) metod för att rendera sken runt ljuskällor är att fördra. Det visuella resultatet är klart högre för dessa metoder i och med att de föremål som befinner sig bakom ljuskällan måste betraktas. Figur 4.3. Dimmans spridningskoefficient β bestämmer hur stort skenet blir runt ljuskällan. Från vänster till höger varierar β med värdena 0.01, 0.04 och 0.08. I figur 4.2 illustreras skillnaden mellan ljuskällor på olika avstånd. Precis som sprid- 40

ningsekvationen beskriver avtar ljusets intensitet olika mycket beroende på avståndet mellan betraktaren och ljuskällan. Detta leder till att en ljuskälla som är belägen långt borta från en betraktare inte ger lika stort sken som en ljuskälla som befinner sig nära. Även dimmans spridningskoefficient β bestämmer hur stort skenet blir: större värden på β ger större sken runt ljuskällan (Se figur 4.3). Detta ger en god möjlighet att variera hur ljuskällor uppför sig beroende på hur tät dimman är vid en specifik tidpunkt på dygnet. Figur 4.4. Några exempel på hur ljuskonen kan användas i en miljö. Bilder hämtade från implementationen i Avalanche Studios grafikmotor. Eftersom varken vertex eller pixel-shadern innehåller komplicerade beräkningar är metoden för att rendera ljusvolymen effektiv. Den enda faktor som drar ned renderingshastigheten är det faktum att modellen kräver en stor detaljrikedom för att inte få ett platt utseende. Det visuella resultatet ger ett realistiskt och trovärdigt intryck då inga andra föremål passerar igenom själva volymen. Detta ger som tidigare diskuterats een skarp kant mellan volymen och föremålet vilket resulterar i att konens geometri lätt kan uppfattas (Se figur 3.9). Även fast beräkningarna för hur ljuset avtar vid kanterna på ljusvolymen inte baseras på en korrekt fysikaliskt modell, ger metoden ett realistiskt resultat för detta fenomen. Animeringen av noise-texturer över ytan på ljuskonen ger en trovärdig illusion av att dimma passerar genom volymen. 41