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".)
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.
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.
Ljuskällan skall ge ett maxvärde >>1, och reflektionen i ytan skall vara spekulär. Provkör. Hur ser högdagern ut?
Implementera en shader som utför lågpassfiltrering. Rendera scenen till en textur (FBO), filtrera till utdata (en rektangel).
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!
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!
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!
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).
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.)
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!
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.
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!
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.