Laborationshandledning TSBK03 Teknik för avancerade datorspel

Laboration 1, Datorgrafik: Mer shaderprogrammering.

Denna laboration bygger vidare på den shaderlaboration ni gjorde i TSBK07. Om ni inte gått den kursen så kan det vara lämpligt att börja med någon av de inledande övningarna från den labben. I labbmaterialet för den labben ingår dessutom en kortfattad översikt över GLSL. (Detta har ni dock förhoppningsvis redan gjort som "labb 0".)

Laborationsskalet

Vi startar med ett labbskal som är likt det från labb 3 i TSBK03. Ladda ner det här.

Men vägen vidare blir annorlunda. Laborationen har två huvuddelar: High Dynamic Range och bump mapping.

Vi arbetar i Linux, i labbet Olympen, med GeForce GTS250-kort. Det finns bättre kort, men dessa kort har hyggliga prestanda, tillräckligt låg strömförbrukning, och klarar både Cuda och OpenCL.

1. Blooming med high dynamic range

Denna laboration är omfattande i antalet steg, men de flesta steg är tämligen enkla. Vi skall försöka skapa en blooming-effekt i en enkel scen. Målet med laborationen är att få en inblick i hur man arbetar med bildfiltreringar, rekursiva shaders och flyttalsbuffrar.

Många av de shaders som skall skrivas har visats på föreläsning 4, så ni kan använda föreläsningsmaterialet som inspirationskälla. Dock kommer dessa inte alltid att fungera precis som givna i föreläsningen. Vissa inparametrar har andra namn, och de täcker inte alla filterfunktioner ni behöver.

Ett antal funktioner tillhandahålls för att underlätta:

initFBO skapar en tom textur med tillhörande FBO.

useFBO väljer en FBO som utdata och två andra som indata. (Skicka 0L om ingen önskas.)

buildShader bygger en shader med ett anrop. Du anger bara källfilerna.

1a. Skriv en shader som lägger en stark ljuskälla på scenen.

Ljuskällan skall ge ett maxvärde >>1, och reflektionen i ytan skall vara spekulär. Provkör. Hur ser högdagern ut?

1b. Implementera ett lågpassfilter.

Implementera en shader som utför lågpassfiltrering. Rendera scenen till en textur (FBO), filtrera till utdata (en rektangel).

1c. Applicera lågpassfiltret rekursivt med ping-ponging för att få en kraftig lågpassfiltrering.

Rendera till polygon över hela framebuffern. Observera att programskalets interaktivitet (getObject Matrix) inte får påverka polygonen.

Du kan använda mer än en shader. Varför vill man det?

Spara resultatet för att kunna visa för assistenten!

1d. Blooming-filter

Skriv en tröskelsättningsshader för att föra över värden över 1 till separat textur. Filtrera denna.

Spara resultatet för att kunna visa för assistenten!

1e. Blooming-effekt

Lägg ihop originalbild (ej filtrerad) med den filtrerade trösklade bilden för att få ett resultat med bloomingeffekter.

Spara resultatet för att kunna visa för assistenten!

1f. Variant EXTRAUPPGIFT

Skapa med lämpliga filter en effekt som ger en kraftig spridning längs diagonalerna kombinerat med en viss lågpassfiltrering. Addera detta som en ytterligare effekt.

Visa för assistenten (speciellt 1e, 1f, 1g, 1h).

Frågor (skissa svar innan redovisning):

2. Bump mapping

Målet med detta laborationsmoment är att få praktisk erfarenhet av att arbeta med bump maps, i både vykoordinater och texturkoordinater (tangent space), därmed få ökad förståelse för hur de olika koordinatsystemen fungerar och hur man transformerar mellan dem.

För enkelhetens skull arbetar vi på enkla plana ytor, så beräkningen av tangentvektorn blir trivial.

Vi använder ett enklare labbskal som du hämtar här. Bumpmaps ingår i paketet.

(Äldre version här som backup.)

Scenen (en kub) är redan klar. Notera att den genereras med tangentvektor. Även bitangent, vilket dock inte är nödvändigt då den kan kryssas fram.

BUGRISK: Under experiment med koden har jag stött på en anomali som kan drabba er (gäller enbart i Linux). Kod som fungerade bra på en maskin fungerade inte på en annan. Det som hände mig var att mina tangent- och bitangenter blev felaktiga så man inte kunde räkna med dem. Resultatet var att fragmenten blev kolsvarta. Om ni stöter på detta och känner att det är oförklarligt, prova då med att hårdkoda tangent och bitangent i vertex shadern. (Deras värden i modellkoordinater är konstanta.)

2a. Bumpmappning i vykoordinater

Din vertexshader transformerar normalvektor och tangentvektor till vykoordinater. Texturkoordinater skickas vidare på vanligt sätt.

Skriv en fragmentshader som beräknar partiella derivatorna över texturen och modifierar normalvektorn efter dessa. Beräkna ljussättning från en ljusriktning (som får vara hårdkodad för enkelhetens skull). Diffus ljussättning räcker.

Detta skall resultera i en trevlig bumpmappningseffekt.

Spara resultatet (även källkod) för att kunna visa för assistenten!

2b. Bumpmappning i texturkoordinater

Skapa matrisen Mvt av vektorerna Ps, Pt, n (i vykoordinater). Ledning: En 3x3-matris (mat3) kan tilldelas med tre vektorer genom att skriva mat3(v1, v2, v3).

Transformera ljusvektorn med dessa. Beräkna ljussättning i texturrymden.

Resultatet skall vara likvärdigt med 2b. Spara resultatet inkl källkod för att kunna visa.

2c. Parallaxmappning EXTRAUPPGIFT

Vi skall nu göra det första steget mot avancerad bumpmappning, parallaxmappning.

Hur finner vi betraktningsriktningen i vykoordinater? Skicka denna till fragmentshader via varying-parametrar.

Transformera betraktningsriktningen till texturkoordinater.

Hur kan man nu utföra ett steg i texturrymden? Utför detta.

Undersök skillnaden med och utan "offset limiting".

Visa resultatet för assistenten!

Frågor:

 

Det var allt för den här labben! Labben är helt nyskriven så jag hoppas att den är intressant och inte för omfattande.

PS: Den var alltför omfattande från början, och i synnerhet var det alldeles för mycket fällor i FBO-implementationen. Jag har därför förenklat, mer är givet och en del steg på slutet har blivit extrauppgifter. Jag ber om ursäkt för detta, jag var överdrivet optimistisk och hade inte analyserat problemen tillräckligt.