Kunskapslyftet: Ambient Occlusion
8

Kunskapslyftet: Ambient Occlusion

Ibland kommer det dagar då man egentligen bara vill stänga in sig och förlora sig i Reckoning, men som spelbloggare finns även ett samhällsansvar som inte kan vänta på sig. När bevarandet av samhällets grundvalar vilar på ens axlar är det viktigt att inte ta för lätt på det. Reckoning får vänta, plikten framför allt. Javisst, det är dags för ännu ett kunskapslyft när det gäller spelteknik.

Dagens ämne är något jag tycker är en av de viktigaste visuella stegen som tagits de senaste åren, och är något som kallas ambient occlusion. Men innan du ger upp och snubblar på att du knappt ens kunde läsa ordet så tar vi det en gång till. Ambient. Occlusion. Amb-jent Åck-lu-schön. Ambient betyder omgivande och occlusion betyder ungefär blockera.

Man skulle, från orden, kunna tro att det handlar om att någon ställer sig mellan dig och en högtalare som spelar musik av Brian Eno. Även om det visserligen är en tolkning av ambient occlusion så är inte det vad jag kommer skriva om här. För istället för blockande av härliga atmosfäriska ljudtoner kommer den här texten handla om ljus, eller snarare blockande av detsamma. Så låt oss fokusera på det innan vi helt förlorar oss i An Ending (Ascent).

Så vad är då ambient occlusion? Det är först och främst viktigt att veta att all ljussättning i spel är approximationer som visserligen är grundade i verkligheten och har en solid teoretisk grund, men som ändå sist och syvende är något som görs för att det är snabbt och ser hyffsat rätt ut. Man fuskar helt enkelt. En grundläggande sådan fuskande ljusmodell i stort sett alla spel (med mer eller mindre avancerade avarter) baseras på en uppdelning av det ljus som en yta reflekterar i tre komponenter. BSpecularity (blänk), diffuse (matt direktljus) och ambient (miljöljus). Genom att variera parametrarna för dessa kan man får till en rad olika material. Mest komplicerat är blänket, följt av diffusljuset. Allra enklast är dock ambientljuset som helt enkelt är att man låter allt som är i skugga ändå vara lite ljusare än kolsvart. Detta för att simulera, på enklaste tänkbara sätt, hur ljuset studsar runt i en miljö.

Enbart ambient acclusion - inga texturer eller övrigt ljus - från spelet Crysis.

Men verkligheten är inte riktigt så enkel. Även på en mulen dag ser vi skuggor under bilar. I hudveck är det lite mörkare än på den släta huden och i ett trångt hörn är det inte bara damm som gör det det lite mörkare än mitt på väggen. Dessa hörn och kontaktskuggor har lyst med sin frånvaro i spel. Möjligtvis har de dykt upp i en statisk miljö där de räknats ut av ett datorkluster under några timmar och sedan inbakat i miljön. Men det var först med Crysis som det blev en lättillgänglig verklighet även för rörliga objekt.

Från början var det dock ILM – Industrial Light and Magic – som ville ha en teknik att snabbt simulera ljust hur ljus studsar runt i en miljö. ILM jobbar med filmeffekter, men även de vill att det ska gå snabbt. Men istället för att gå hela vägen och simulera en hel verklighet med flera ljusstudsar och vänta flera timmar per bildruta kom man på en teknik som kunde få ner tiden till minuter istället. Genom att fuska. Man tog helt enkelt att från varje pixel skjuta ut små virtuella strålar åt alla håll. De strålar som träffade något i närheten räknades som träff och de som missade blev såklart en miss. Sedan räknade man ut ett genomsnitt och fick då helt enkelt en procent av hur många som träffade något. Detta värde avgjorde hur mycket man skulle mörka ner sin ambientkomponent. Ju mer något låg i ett skrymsle desto fler strålar träffade något och ju mörkare blev det. Den visuella skillnaden blev enorm och tidsåtgången var mycket mindre än traditionella mer korrekta metoder.

Illustrerande bild hur klassisk ambient occlusion fungerar. I detta fall blir pixeln skuggad till 25%.

Detta var dock fortfarande bortom vad som gick att göra i ett spel. Att få en bildruta var tredje minut skulle ju inte funka så bra för att få till de där precisa headshotsen. Men så gjorde Crytek sitt genombrott genom att fuska ännu mer och förenkla en del. Man fick något som var tillräckligt bra och bollen var i rullning.

Istället för att skjuta strålar åt alla möjliga håll så fort man ritar ut en polygon för att se om strålarna träffar några andra trianglar (långsamt!) så kom man på att resultatet blir tillräckligt bra om man istället tar den färdiga bildrutan och dess djupbuffer (bild i minnet som innehåller avståndet till kameran för varje pixel) och kollar på lite slumpartade ställen i djupbuffern i närheten av den aktuella pixeln för att se om det finns något där som kan blocka ljuset. Tekniken kallas för SSAO – Screen Space Ambient Occlusion. Det är inte perfekt, och det kan ibland leda till en känsla av mörka skuggor runt alla objekt. Speciellt om man gör en väldigt enkel variant av tekniken, som i Deus Ex, där effekten är stark överdriven.

Numera ser man tekniken i fler och fler spel, men tyvärr inte alla. För även om det ibland överdrivs så har jag hittils bara sett ett exempel på att det vart riktigt dåligt gjort och det var i Halo Reach. Men likt lens flares såg ut som skit i Monster Truck Madness så kan de idag se helt fantastiska ut i spel som nya Syndicate. Och även i Reach var det bättre än utan. Om du vill kika efter effekten så ta en titt i ovan nämda titlar. Annars finner du den i en väldigt subtil implementation i Uncharted 2 och 3. Du finner den i Starcraft 2 och The Witcher 2 och om du är PC-spelare kan man även lägga till den till spel i efterhand med hjälp av en så kallad injector.

Utan kontaktskuggor är det omöjligt att bedömma avstånd och storlek på bollarna. Med skuggorna blir det nästan läskigt hur djupet träder fram.

Slutresultatet av det hela är att ambient occlusion gör att pappkartongerna och terracottakrukorna slutar sväva i luften på odefinierat avstånd och istället blir grundade i världen och får både storlek och avstånd som hjärnan lätt läser av. Bilden smälter ihop och det slutar vara distinkta objekt med olika texturupplösning och kvalité utan blir istället en helhet – även om texturupplösningen kanske skiljer sig markant. Det tycker jag är bland det viktigaste en grafisk teknik kan göra. Skapa en helhet och trovärdighet som leder till ökad inlevelse – oavsett grafisk stil – och få oss att förlora oss i världen och dess karaktärer.

Dessutom är det ju aldrig fel med lite grafiskt lull-lull.

GI-metoden
8

GI-metoden

Alla spelintresserade stöter med jämna mellanrum på en rad tekniska begrepp som i mångt och mycket används för att sälja in just förträffligheten i den aktuella produkten. För någon som inte är så insatt kan det lätt bli lite förvirrande. Det senaste på tapeten att diskuteras är något som kallas GI. När vanliga dödliga tänker på kosthållning och köttintag så tänker en renderingsprogrammerare som mig själv på ljus och skuggor. Då tekniken är aktuell i samband med nysläppta Crysis 2 och kommande Battlefield 3 så kände jag att det var dags att höja medvetenheten något bland mina läsare.

Det är helt enkelt dags för kunskapslyftet!

GI står för Global Illumination, vilket troligtvis inte gjorde någon klokare än förut, men håll ut tappra läsare. Vi kommer dit. Men låt mig kortfattat säga att global illumination är ett samlingsord för olika metoder att simulera hur ljus studsar omkring i en miljö för att skapa en realistisk ljussättning.

Tänk på ditt vardagsrum. När solen slår in genom fönstren – om du bor i en falloutbunker utan fönster får du låtsas att du har fönster. Nåväl, när solen slår in genom fönstren så förblir det ju inte kolsvart i resten av rummet där ljuset inte direkt träffar, utan det studsar vidare och slutligen blir hela rummet ljust och fint. Dessutom ser man dammet i hörnena. Dumma, bistra, verklighet!

Traditionellt i datorspel brukar man ta detta kolsvarta utrymme och bara fylla med ett konstant och från alla håll jämt ljus, normalt kallat för ambientljus. Det ser ohyggligt platt ut eftersom inget annat än just ytans färg framkommer.

Samma miljö utan och med global illumination. Notera hur den röda färgen blöder över på omgivningen. Bilden är från CryEngine 3.

Verkligheten har, damm i hörnena till trots, ett stort övertag mot våra datorer. I verkligheten ”räknas” ljuset ut av sig själv i realtid, medan i en dator är global illumination en process som traditionellt tar väldigt lång tid att räkna ut. I en högkvalitativ lösning kan det ta många minuter per bildruta. Hur gör man då för att få detta att funka i spel?

Det korta svaret är: Man fuskar.

Idag använder väldigt många spel sig av någon form av global illumination. Den vanligaste varianten är att man tar hela sin spelnivå och sätter den på att räkna ut hur ljuset studsar runt i den. Allting lagras sedan som unika texturer – så kallade lightmaps – för varje yta som innehåller ljusstyrkan, och ibland även den inkommande ljusfärgen, på den aktuella ytan. Pionjären för detta, som för så mycket annat, var id softwares Quake. Nackdelen med denna teknik är att det dels tar en hiskelig tid – ibland flera timmar – att räkna ut ljuset för en hel nivå samt att när man väl räknat ut allt så är lösningen helt statisk. Ändrar sig något i nivån, eller en lampa flyttar på sig, så stämmer inte längre ljuset.

Det är bland annat därför saker som lådor och annat man kan manipulera ofta känns lite som att de inte riktigt är en integrerad del av världen. Spelens motsvarighet till den tecknade filmens sämre kvalité på den stenmur som om några sekunder kommer rasa sönder. Dynamiska ljuskällor kan också bara bidra med direktljus och ingen av de sekundära ljusstudsarna. Ljuset från dem lämnar, så att säga, vardagsrummet (eller bunkern) kolsvart förutom där de direkt träffar. Dessutom tar texturerna som lagrar all denna ljusinformation en ordentlig hög med minne i anspråk. Snyggt blir det dock, vilket är tydligt i ett spel som Mirror’s Edge, som använde denna teknik på ett mycket effektivt sätt.

Så långt är allt ganska traditionellt. I många spel funkar det dessutom riktigt bra. Tyvärr undviker många spel även att använda lightmaps på grund av dess minneskostnad och osmidighet vid utvecklingen. Men vad är det som skiljer Crysis 2 från ovanstående modell som gör att det pratas så mycket om just detta? Jo, i Crysis 2 finns inga lightmaps, utan allt global illumination-ljus räknas ut on-the-fly av spelmotorn. Hur det går till rent tekniskt kommer jag inte gå in på, men sättet det görs på är riktigt smart och snabbt, och innefattar såklart ett visst fuskande. Men slutresultatet blir väldigt nära den fysiskt korrekta lösningen med den stora fördelen att miljön, ljuset och, tja, allting kan ändras hur som helst, när som helst. Dessutom så ljussätts allting enligt samma modell och det är därför ingen skillnad på en flyttbar kon eller en stenhård vägg. Allt detta klarar den av på runt 4-5 ms på en gammal trött Xbox 360. Minst sagt imponerande. Vad som kommer ur den spelmotorn i framtiden blir riktigt spännande att se.

En mellanväg att gå är att göra ett system likt det i det numera nedlagda kinectprojektet ”Milo” där miljön innehöll information som tillät att ljuset ändrades hur som helst och kunde studsa runt i miljön men miljön i sig var tvungen att vara statisk. Då den största delen av alla speliljöer är väldigt fasta var det ett intressant grepp.

Global illumination på (höger) och av (vänster) i Frostbite 2 - spelmotorn som driver Battlefield 3. Intressant även Mirror's Edge-estetiken i exempelmiljön. Än finns hopp för en tvåa.

Och slutligen så har vi Battlefield 3, som även det innehåller en lösning för global illumination. Jag har mest skummat i deras publicerade papper om denna så jag kan missta mig, men det verkar som om den är främst gjord för statiska miljöer, likt dem i Milo, men att det även verkar gå att använda den för dynamiska miljöer också – själva kärnan i de senare Battlefieldspelen. I stort handlar den om att räkna ut ljuset i en väldigt enkel version av världen och sedan överföra det till den högdetaljerade versionen.

Framtiden ser ljus ut, med många studsar, och det kan bara bli bättre och snyggare spel som resultat. Förhoppningsvis har du, min läsare, lärt dig något nytt och jag hoppas att jag varken blev för komplicerad eller gjorde för många förenklingar utan hittade en balans. Med lite tur är nu kunskapen både lyft och intresset efter att veta mer taggat.

Uppdaterat:

Läs mer och grotta ner dig i detaljerna för hur CryEngine 3 gör på deras site:

Real-time Diffuse Global Illumination in CryEngine 3