• No results found

Occlusion-metoden som används i artefakten är inspirerad av ​Ohlsson & Seipel (2004) och dess syfte är att se till att snö enbart hamnar på ytor som fallande snö faktisk kan nå, exempelvis så ska det inte finnas snö inne i tunneln då denna är övertäckt med stenar sett från snöriktningen. Metoden bygger på att en punkt bara ska ha snö om den är den närmaste punkten till himlen sett från snöriktning. Till skillnad från Ohlsson & Seipel (2004) metod så har occlusions-metoden i ​artefakten ​inget brusfunktion vilket gör den enklare att implementera. Eftersom snöfallet i ​artefakten ​är kraftigt ska ytorna som täcks av snö vara helt täckta med snö. Därmed ansågs det extra arbetet med att implementera brus på ett tillfredsställande sätt inte vara nödvändigt och den sparade tiden kunde läggas på annat.

För att ge shadern input om ett objekts occlusion används en occlusions-textur, exempelvis är ​GroundOcclusionTexture ​occlusions-texturen för marken. Pixlarna på occlusions-texturerna har färger mellan vitt och svart, där de svarta områdena är punkter där snö ska placeras.

26

Occlusions-texturerna skapas av ett skript som heter ​TextureScript​. TextureScript skapar en occlusions-textur av valfri pixelstorlek. I ​artefakten ​har alla occlusions-texturerna storleken 2048 * 2048 pixlar och har därmed samma upplösning. Alla pixlar i occlusions-texturerna är till början vita och för varje pixel görs en raycast från en inställbar riktning som representerar snöriktningen, vilket i ​artefakten ​har varit (x,y,z) = (0,-1,0) för alla occlusions-texturer, som är rakt neråt sett från markens perspektiv. Startpositionen för raycasten sett från pixelns perspektiv är i motsatt riktning till riktningen på raycasten. Detta innebär att raycasten kommer träffa pixeln om ingen objekt är emellan raycastens startposition och pixeln. I sin tur innebär detta att om raycasten träffar objektet som occlusions-texturen tillhör, så är detta området exponerat för snö och därmed sätts pixelns färg mot svart. För att kanterna mellan där det ska vara snö och områdena där det inte ska vara snö, inte skall bli för skarpa så används sampling, vilket innebär att även pixlarna som är grannar till den träffade pixeln blir mörkare. För att en pixel ska bli helt svart så måste den och dess närmsta 288 pixlarna alla vara exponerade för snö. När TextureScript har gått igenom alla pixlar, vilket för en 2048 * 2048 textur är 4,194,304 pixlar, är occlusions-texturen klar för användning.

Figur 16: ​Occlusions-texturen för stillastående bilar i artefakten. De svarta områdena är där snö ska placeras på bilen medan de vita områdena representerar de områden på bilen som

inte ska ha snö.

Det tar det betydande tid att enbart skapa en enda occlusions-textur då en 2048 * 2048 textur har många pixlar och det ska göras en raycast för varje pixel. Felinställningar innebär därmed att mycket tid går förlorad om occlusions-texturen behöver göras om. Detta innebär att det är önskvärt att återanvända samma occlusions-textur, vilket enbart fungerar för objekt av samma form och position. Ett exempel är stenmuren i artefakten, då eftersom stenmuren ser ut som den gör kan en enda occlusions-textur användas för samtliga stenar i stenmuren.

Ett betydelsefullt problem som har uppstått med TextureScript och skapandet av occlusions-texturer är att den inte alltid tog hänsyn till objektets skalor, för ett objekt vars förälder var uppskalat med en faktor 10, ignorerade TextureScript att göra raycast för de yttre pixlarna och istället gjorde flera raycast på de inre pixlarna, vilket innebar att enbart ett litet område på objektet täcktes med snö. Detta problem löstes genom att skapa en variabel som låter användaren av TextureScript skriva in vilken skala objektet och dess föräldrar har och detta i sin tur justerar avståndet mellan raycast så de riktas mot rätt pixlar.

27

Figur 17: ​Visar den viktigaste delen i TextureScript. Två for loopar går igenom bredden och höjden på texturen, en pixel i taget. If-satsen från 135 till 144 bestämmer startpositionen på

raycasten. Raycasten sker i if-satsen på 147. If-satsen på position 149 kontrollerar om raycasten faktiskt träffade objektet som TextureScript är knuten till; om den inte träffade

objektet så innebär det att positionen inte är exponerad för snö; om raycasten träffade objektet så mörkas pixelns och de närmsta 288 pixlarnas färg.

Occlusions-texturer används främst av shadern ​Real-time Rendering of Accumulated Snow Shader ​som skapats för detta arbete och vilken är den shader som används av de flesta objekten i spelvärlden. Real-time Rendering of Accumulated Snow Shader är utvecklad i Unity Shadergraph (Unity Technologies, 2020b) och den använder tre texturer, en som heter GroundTexture​vilket är objektets textur, en som heter ​SnowTexture​vilket är en snötexturen och den sista texturen är occlusions-texturen. Shadern använder occlusions-texturens röda färg för att bestämma hur mycket som GroundTexture och SnowTexture ska synas på ett område. Om den röda färgen är nära 1 kommer främst GroundTexture att synas medan om den är nära 0 kommer främst SnowTexture att synas. Dessutom har Real-time Rendering of Accumulated Snow Shader en tidsvariabel som bestämmer hur mycket SnowTexture ska synas. Om det har gått mindre än 30 sekunder från start kommer inte SnowTexture ha full styrka, vilket gör att när ​artefakten ​startar har inte objekten någon snö på sig, utan snön kommer gradvis fram tills den når full styrka 30 sekunder efter ​artefakten ​start.

Ingen av tidsfunktionerna i Shadergraph fungerade tillfredsställande då de antingen loopar, ränkar tiden från runtime eller bara tiden mellan varje frame utan att spara den totala tiden från en versions början. Det som önskades är en tidfunktion som håller reda på tiden från en versions start. Den önskade tidfunktionen erhölls genom att använda tidsfunktionen i TextureScript. Alla objekt som använder Real-time Rendering of Accumulated Snow Shader använder också TextureScript. TextureScript tidsfunktion använder Unity funktionen update

28

som anropas vid varje frame för att uppdatera tidsvariablen i shadern vilket i sin tur påverkar snöstyrkan hos objekten.

Figur 18: ​Så här ser bilen ut när den använder occlusions-texturen från Figur 16 och shadern ​Real-time Rendering of Accumulated Snow Shader​.

Anledningen till att enbart använda den röda färgen hos occlusions-texturen för att bestämma occlusion i shadern är att då kan den gröna och blå färgen i occlusions-texturen användas i andra syften. Tanken var att den blå färgen skulle kunna användas för att ta hänsyn till kanter hos objekt. Detta skulle användas för att öka höjden på snöområden på husens tak, vilket skulle ge en upplevelse att snömassan på taket ökar över tid. Dock visade det sig att detta orsakade tydliga gap i husens tak, vilket försämrade realismen och därmed togs detta bort. I nuläget används enbart den röda färgen i occlusions-texturena.

Figur 19: ​Problem med att taken lyfte sig på olika sätt som inte såg realistiska ut är anledningen till att ​shadern Real-time Rendering of Accumulated Snow Shader inte påverkar

positionen hos objektets vertexar.

29

Figur 20: ​Visar ​Real-time Rendering of Accumulated Snow Shader vilket är den shader som används av de flesta objekt i scenen. Se appendix D för närbilder av delarna ett till sex.

De sju delarna som är inringade i Figur 20 beskrivs nedan

1. Har hand om tidsvariabeln och en smoothstep som är inställd så att dess värde går mellan 0 och 1 då tiden får mellan 0 och 30.

2. Har hand om styrkan på occlusions-texturen. Enbart den röda färgen av occlusions-texturen används. Resultatet från del 1 används för att bestämma

påverkan av occlusions-texturen, är resultatet nära 0 så kommer occlusions-texturen att ignoreras och istället kommer ett resultat nära ett, vilket innebär att det inte ska finnas snö skickas till del 3 och 4. Om resultatet från del 1 är 1 så kommer resultatet av del 2 vara helt baserat på occlusions-texturen, ett resultat av 1 innebär att det inte ska finnas snö och ett resultat nära 0 innebär att det inte ska finnas snö.

3. Här bestäms styrkan hos groundTexture vilket är objektets textur. Denna del tar emot resultatet från del 2 och multiplicerar groundTexture med detta vilket innebär om resultatet är nära 0 så kommer inte groundTexture att synas. En variabel som heter RGB låter användaren ställa in hur mycket av de tre färgerna på groundTexture ska vara synliga.

4. Här bestäms styrkan hos snowTexture vilket är snötexturen som objektet ska ha.

Denna del tar emot resultatet från del 2 och multiplicerar snowTexture med (1 - resultatet), vilket innebär att om resultatet är nära 1 kommer inte snowTexture att synas. Detta innebär också att ju synligare snowTexture är, desto mindre synlig kommer groundTexture att vara och vice versa. En variabel snowMultiplier låter användaren att bestämma hur synlig snowTexture ska vara.

5. Här adderas texturerna från del 3 och 4 ihop som sedan används för att ge objektet sin slutliga färg.

30

6. Diverse variabler för flexibilitetet i utseendet, men alla objekt i ​artefakten ​använder startinställningar för dessa variabler.

7. Del vars syfte är att påverka höjden på ytor som har snö, men detta fungerade inte bra och inget objekt använder detta.

4.3.2 Fallande snö

För att skapa fallande snö används ett partikelsystem som beskrivs i del 2.6. Unitys inbyggda partikelsystem är mycket flexibelt och kan användas för att skapa många typer av partikelsystem.

För att ge partiklarna ett utseende av snö används en textur för en diffus snöflinga som alltid renderas mot kameran. Partiklarna skapas i en fyrkant ovanför hela banan. Partiklarna faller sedan med en begränsad hastighet nedåt i scenen. De försvinner efter en viss tid som i detta fall är 32 sekunder. Hastigheten nedåt av partiklarna görs genom ändring av parametern Simulation Speed som ändrar hela partikelsimuleringens hastighet. Denna metod är optimal då begränsnings hastigheten inte behöver ökas utan skalar direkt med simulerings hastighet (U​nity Technologies, 2020e)

Figur 21: ​Bild av de primära inställningarna för partikelsystemet samt partikelsystemet i scenen, till vänster.

Related documents