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:



”jag hoppas att jag varken blev för komplicerad eller gjorde för många förenklingar utan hittade en balans”
Enligt mig hittade du en perfekt balans som till och med sög tag i MIG! Mycket informativt och intressant inlägg. Tack Malmer <3
Riktigt intressant på en perfekt nivå för mig! <3
Jätteintressant och bra skrivet med tydliga exempel, blev sugen på att läsa mer om detta.
Ska villigt erkänna att jag aldrig brytt mig om ljus i spel (förutom i Thief serien), men nu kan jag inte låta bli att undra lite över hur de har löst ljuskällorna i The Sims 3, för jag minns tydligt några irriterande buggar.
Kul att få lite insideinformation om spelutveckling. Fortsätt gärna med det!
Kul att ni gillade det. Kan bli fler kunskapslyft i framtiden då.
Smoothe: Nu är jag inte ”inside” utan mer ”brevid”. Jobbar med 3d-rendering av den mer klassiska sorten. Mycket gemensamt dock.
”Framtiden ser ljus ut”
Riktigt intressant skrivet. Jag fuskade ju en del i 3Dstudio, för en, siså där 15 år sedan, så jag har en rudimentär (mycket rudimentär) förståelse för grunderna. Men det här var klart informativt. Hade t.ex. ingen aning om att det var Quake som var först med att lagra ljusinformationen i texturerna.
Gott jobbat! Gärna mer sånt här i framtiden.
Tycker du la dig på en perfekt nivå. Informativt men enkelt att förstå. Väldigt bra skrivet!
Riktigt intressant läsning!