Procedurell grottgenerator och eld i GLSL. Marcus Widegren



Relevanta dokument
Procedurell Terräng med LOD i OpenGL 4

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Procedurell stad. Projekt i kursen TNM022 Procedurella metoder för bilder. Tobias Heldring, tobhe

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

Procedurell 3D-eld på grafikkortet

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

TNM022 Proceduella Bilder Rendering av proceduell päls i realtid

Kurvlängd och geometri på en sfärisk yta

Procedurell renderingsmotor i Javascript och HTML5

9-1 Koordinatsystem och funktioner. Namn:

Lathund algebra och funktioner åk 9

Datorlära 3 Octave Workspace ovh mijlö Skriva text på skärmen Värdesiffror Variabler och typer Strängar Makro Vektorer

Eggnappers GDD. High Concept. Genre. Grafisk stil. Features

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1.

The Procedural Arctic

Begrepp :: Determinanten

Anders Logg. Människor och matematik läsebok för nyfikna 95

Inlämningsuppgift 4 NUM131

Programmeringsolympiaden 2012 Kvalificering

Kv. Ogräset. Martin Stenmarck,

TNM011 Grafisk teknik Laboration 3 - Färg

Projekt i TNM084, Procedurella bilder

Senaste revideringen av kapitlet gjordes , efter att ett fel upptäckts.

Fotorealistiska bilder 1 PV360 kap 1 7: Grunder samt material och dekaler i Photoview 360

1 Cirkulation och vorticitet

TNM059 Grafisk teknik Laboration 4 - Färg

4:4 Mätinstrument. Inledning

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

Observationer rörande omvandling av digitala yttäckande vektordata till rasterformat.

Bygga hus med LECA-stenar

Högskoleprovet. Block 4. Anvisningar. Övningsexempel. Delprovet innehåller 22 uppgifter.

Grunderna i stegkodsprogrammering

RESTAURERING AV GAMLA FOTOGRAFIER

NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot

Objektiv. Skillnad i egenskaper mellan objektiv med olika brännvidder (småbild)

Dataprojekt. Nanovetenskapliga tankeverktyg. January 18, 2008

Partiklars rörelser i elektromagnetiska fält

I addition adderar vi. Vi kan addera termerna i vilken ordning vi vill: = 7 + 1

PROCEDURELLT GENERERADE BANOR MED HÖJDSKILLNADER OCH BRA FRAMKOMLIGHET PROCEDURALLY GENERATED MAPS WITH HEIGHT DIFFERENCE AND GOOD EXPLORATION

Träningssplan: vecka 1-6

Sammanfattningar Matematikboken Z

Bonusmaterial till Lära och undervisa matematik från förskoleklass till åk 6. Ledning för att lösa problemen i Övningar för kapitel 5, sid

FÖRSVARSSPEL. Högt försvarsspel Spelare samarbetar för att vinna boll på motståndarlaget planhalva.

Figur 1. Skärmbild med markerade steg i videon. Diagram och tabell som visar positionerna som funktion av tiden.

Matematik Åk 9 Provet omfattar stickprov av det centrala innehållet i Lgr b) c) d)

HALFTONE SHADER APP HEMSIDA: Skapad av: John Tolunay

SF1624 Algebra och geometri Tentamen Onsdagen 29 oktober, 2014

Tips och tricks 1 Cadcorp SIS

Instruktion för att slutföra registreringen

Hanne Solem Görel Hydén Sätt in stöten! MATEMATIK

Ovningsbankens Handbollspaket Styrketräning

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

Användbarhet i vardag och praktik. Reflektioner nedtecknade av Sten Sunnergren. Med tillstånd av fam Sunnergren

Mätdatum (nr 1 9) resp ((nr 10 12)

MATEMATIK Datum: Tid: förmiddag Hjälpmedel: inga. Mobiltelefoner är förbjudna. A.Heintz Telefonvakt: Christo er Standar, Tel.

Sidor i boken , , 3, 5, 7, 11,13,17 19, 23. Ett andragradspolynom Ett tiogradspolynom Ett tredjegradspolynom

Kärnkraftens vara eller icke vara Är kunskap och åsikt om kärnkraft relaterade till varandra

Riksfinal. Del 1: 6 uppgifter Tid: 60 min Maxpoäng: 18 (3p/uppgift) OBS! Skriv varje uppgift på separat papper och lagets namn på samtliga papper.

en femma eller en sexa?

LEGO Robot programmering och felsökning Hur svårt ska det vara att följa den svarta linjen?

Konsultation angående skötsel av dammar och ängar på Kungsbacka golfbana

52101 Utforska siffror

Bossgården, Stenstorp ELBP Energieffektivisering i lantbrukets byggprojekt. David Hårsmar, Energirådgivare Hushållningssällskapet /

MA 1202 Matematik B Mål som deltagarna skall ha uppnått efter avslutad kurs.

Digitalt lärande och programmering i klassrummet. Introduktionsworkshop - Bygg ett akvarium i Scratch

Övningsuppgift 8. ArchiCAD 16. Eget Bibliotek ! Med kopieringsrätt för Peder Skrivares skola, Varberg

Dimensioner och fraktal geometri. Johan Wild

8-4 Ekvationer. Namn:..

Information Coding / Computer Graphics, ISY, LiTH. Integrationsmetoder

Att använda pekare i. C-kod

L A B R A P P O R T 1

Margretelund - Åkersberga Dykande besiktning

4-7 Pythagoras sats. Inledning. Namn:..

UPPGIFT 1 ÖVERSÄTTNING

Kapitel 1 ljudet Jag hörde något hörde du det vad ljudet vart i golvet. Jobba nu ja ja men jobba då ja. Jag hörde det igen jag hörde också det det

Tentamen i Matematisk statistik Kurskod S0001M

Kompletterande lösningsförslag och ledningar, Matematik 3000 kurs B, kapitel 1

2011 Studsvik AB PANORAMA-BILDTAGNING. Tony Björkman

Lösningar till linjära problem med MATLAB

75059 Stort sorteringsset

varandra. Vi börjar med att behandla en linjes ekvation med hjälp av figur 7 och dess bildtext.

DIGITAL RASTRERING. DIGITALA BILDER (pixelbaserad) ppi (pixels per inch) Sasan Gooran

e-sense move dali Manual

PM Riksläger 2016 Allmän information Kontrol markering: Kontrol Definition: Kartritare: Banläggare: Observera!

TATA42: Föreläsning 10 Serier ( generaliserade summor )

Facit till Några extra uppgifter inför tentan Matematik Baskurs. x 2 x

4:7 Dioden och likriktning.

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

36 träfigurer (20 träfigurer och 9 halvfigurer som kan stå i spår, 7 magnetiska träbitar)

Öppna bilden C:\Photoshop5-kurs\Bananer 96ppi.psd. Aktivera verktyget Färgpyts i verktygslådan.

Skötbordsguiden DIN GUIDE TILL DET BÄSTA SKÖTBORDET

Svar och arbeta vidare med Student 2008

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

Muffinsmysteriet. Avsnittet innehåller: problemlösning, matematiska relationer, taluppfattning, multiplikation och systematisering.

BRUKSANVISNING. Modell: LMDT-810 Rörelsevakt / IR som sänder självlärande kodsignal till ansluten Nexa mottagare

WALLENBERGS FYSIKPRIS 2014

Ekvationssystem - Övningar

Innehållsförteckning

Semesteromställning Personec P

SF1626 Flervariabelanalys Tentamen Måndagen den 27 maj, 2013

Transkript:

Procedurell grottgenerator och eld i GLSL Marcus Widegren 14 januari 2012

Innehåll 2

Sammanfattning Jag har gjort en enkel procedurell grottgenerator i GLSL och C++. För belysning används en fackla, som också är gjort i GLSL. Grottan är en cylinder, vars geometri förändras i en vertex-shader med hjälp av en fraktal av Simplex Noise.

Kapitel 1 Implementation 1.1 Cylinder Innan vertex-shadern är grottan bara en rak cylinder. Detta görs enkelt genom att göra en dubbel for-loop med avseende på θ och h och sedan få koordinaterna för punkterna med: x = r cos θ y = r sin θ z = h N = ( x r y r 0 ) (1.1) Där N är ytans normal och r är radien. För att slippa flytta på grottan medan man rör sig framåt fungerar det så att när kameran gått mer än en längdenhet framåt i z-led flyttas kameran bak en längdenhet och texturkoordinaterna förskjuts framåt. På så sätt ser det ut som att man går framåt även fast man inte gör det. 1.2 Fraktal Det mesta i projektet som är procedurellt genererat är baserat på fraktaler av simplex noise. Fraktalen är en summa av simplex noise i flera frekvenser. Om inget annan anges är det funktionen nedan som menas som fraktal i resten av texten. for i = 0.0 octaves do i i + 1.0 noise+ = snoise(textur_koordinater 2 i ) 2 i end for noise+ = (octaves octaves ) snoise(textur_koordinater 2 octaves ) 2 octaves octaves anger hur många frekvenser som ska användas vid noiseberäkningen. Det behöver inte vara ett heltal, och går därför att justera gradvis för att t ex få mer detaljer när man ser närmare på en yta genom att öka antalet oktaver (octaves) desto närmare kameran punkten som renderas är. Med snoise menas GLSL-implementationen av Simplex Noise skriven av Stefan Gustavson. Hur många dimensioner variabeln textur_koordinater har bestämmer hur många dimensioner snoise körs med. 2

1.3 Displacement Displacement sker i vertex shadern med hjälp av simplex noise. Två fraktaler kontrollerar hur punkternas position ändras. En med hög frekvens som får väggarna att se ojämna ut samt en med lägre frekvens som får grottan att svänga i sidled. Båda dessa fraktaler har ett variabelt antal oktaver, som också bestäms med hjälp av simplex noise. Detta innebär att vissa delar av grottan är ganska jämna och släta medan andra delar är mer skrovliga. Normalerna räknas ut med hjälp av finita differenser. Displacement räknas ut för punkten som ska flyttas, samt två närliggande punkter sen räknas normalen ut med en kryssprodukt. Figur 1.1: Grottan med lågt oktavvärde (vänster) samt högt oktavvärde (höger). 1.4 Textur Stentexturen är baserad på en blandning av worley och simplex noise. Simplex-delen består av tre fasta frekvenser samt en fraktal vars oktaver ökar när man ser nära på en yta. (oktaverna är noll tills man kommer ganska nära) Ljusmodellen som används är vanlig phong, där ljusstyrkan avtar kvadratiskt med avseende på avståndet till ljuskällan. Ljusstyrkan beror också på hur stor elden för tillfället är. 1.5 Bump mapping För att få en ojämn yta utan att behöva ha hemskt många trianglar har jag implementerat bump mapping. Ett noise-värde tas fram med hjälp av en fraktal som representerar hur mycket positionen i den punkten på ytan ska förflytta sig i normalens riktning. Eftersom riktig displacement inte kan göras i en fragmentshader räknas istället en ny normal ut, efter hur ytan hade sett ut med sådan displacement. Figuren nedan visar detta lite tydligare. (tagen från Morten Mikkelsen) 3

Noise-funktionen jag använder räknar inte ut någon derivata, så det implementerades istället med hjälp av finita differenser. Med andra ord räknar jag inte bara ut noise-värdet i den nuvarande punkten på ytan, utan också i två närliggande punkter och använder sedan dessa tre positioner för att få fram en normal i punkten. Antalet oktaver som bump-mappen använder varierar med avseende på hur nära kameran punkten som renderas är samt varierar med en noise-funktion som beror på hur långt i grottan man har gått. Ett exempel på när bump mapping gör stor skillnad visuellt är spekulära ytor, till exempel isfläckarna i grottan. Figur 1.2: En isfläck utan (vänstra) och med (högra) bump mapping. 1.6 Fackla Facklan och elden är implementerade helt i GLSL, och hålls framför kameran genom att Vertex shadern helt enkelt inte flyttar på punkterna. Elden är uppbyggd av en fraktal i två dimensioner och avtar med ett smoothstep desto längre bort punkten som renderas är från eldens centrum. Y-positionen i eldens texturkoordinater flyttar sig uppåt med avseende på tiden, så att det mer liknar eld. 4

Elden multipliceras sedan också med ett simplex noise som enbart är beroende av tiden. Samma multiplikation sker också i grottans fragmentshader så att när elden flammar till så blir det även ljusare i grottan. Efter noise-värdet har räknats ut sätts färgerna såhär: red = noise green = noise 4 blue = smoothstep(0.6, 1.0, noise 0.5) noise 2 0.5 (1.2) Det ser däremot inte exakt så ut i koden, eftersom alpha-värdet måste räknas med där för att de yttre delarna av elden ska vara genomskinnliga. Facklan är helt enkelt en brun färg som avtar desto längre ifrån facklans centrum (en linje i detta fall) punkten är. Sedan multipliceras färgen med simplex noise, hur stor elden är just nu och hur långt ifrån eldens centrum punkten är. 1.7 Dimma Den mystiska dimman i grottan är implementerad med ett enkelt smoothstep med avseende på positionen i y-led. Dimman har konstant färg tills den är ganska långt bort från ljuskällan. Avtar den för snabbt med avseende på avståndet syns det tydligt att dimman helt enkelt är golvet med blå färg. 1.8 Isfläckar Ett tvådimensionellt simplex noise avgör var i grottan det är is. Isen visar bump-mappen väldigt väl, och får grottan att se lite mer intressant ut. Skillnaderna i rendering är att isen har en spekulär del i ljusmodellen och resultatfärgen är lite mörkare samt lite blå. 1.9 Övrigt Projektet är implementerat i OpenGL, och det mesta görs i GLSL. GLFW användes för att skapa fönster, hantera input från tangentbord, hålla koll på hur lång tid varje frame tar osv. Biblioteket GLM har använts för att hantera matriser då GLSL 3.30 kräver att man hanterar sådant manuellt. Projektet är skrivet i C++. För styrningen används sfäriska koordinater med glulookat. 5

Kapitel 2 Resultat 2.1 Prestanda Programmet, i sin nuvarande form, är väldigt krävande. Med ett Nvidia 9600GT renderas ungefär 10 bilder per sekund och med ett Nvidia GTX570 renderas ungefär 120 bilder per sekund. 2.2 Bilder 6

7

2.3 Video En demovideo finns här. (från och med den 15e januari) 8

Kapitel 3 Diskussion Mycket som just nu räknas flera gånger per sekund på GPU-sidan skulle kunna flyttas till CPUsidan (eller med t ex CUDA eller OpenCL) och bara räknas ut när det behövs. Till exempel displacement skulle kunna flyttas från vertex-shadern då det faktiskt inte behövs räknas ut i varje frame. Även stenmaterialet skulle kunna representeras som en bildtextur istället. (åtminstone den del av texturen som inte har dynamisk level of detail) Grottan blir just nu ganska snabbt tråkig, eftersom den saknar större variationer. Exempel på variationer skulle vara att stenmaterialet varierar mellan några olika sorter beroende på vart i grottan man är, variation i y-led med vatten under en viss nivå. Lösa stenar och sand hade även gett en mer dynamisk känsla till grottan, speciellt om stenarna till exempel flyttade på sig när man går över dem och sanden gör virvlar eller något liknande. Just nu räknas normaler ut med hjälp av finita differenser, vilket är ganska onödigt eftersom derivatan till simplex noise går att räkna ut billigt. 9

Kapitel 4 Referenser Simplex Noise, Stefan Gustavson. Bump mapping, Morten Mikkelsen. Phong-modellen, Wikipedia. 10