-
Introducerar Spelkriget.se
-
Bloggen upphör…eller?
-
Senaste kommentarer
3 Till försvar av 3D: Del 2 – Gratis 3D
I förra delen behandlade jag grunderna för stereoskopisk 3D och skall i den här delen gå lite djupare och visa hur man kan göra vilket spel som helst till 3D utan större kostnad rent prestandamässigt. Detta inlägg handlar således inte om hur du kan få till 3D effekt gratis genom att dra en damstrumpa över plasma-TV:n och ta på dig ett par Ray-Bans från -76.
Det kan verka magiskt, men det går faktiskt att skapa två bilder med olika perspektiv på nästan samma tid som det tar att skapa en utan att rendera två gånger och därmed behöva kompromissa med bilden. Vilka spel det är som använder sig av denna tekniken är svårt att veta. Att döma av utvecklarkommentarer så är det nästan helt säkert att Crysis 2 gör det. De kallar det för sin secret sause. De förklarar inte hur de gör, men givet mina erfarenheter är det ganska tydligt att själva hemligheten har sin början i något som är vanligt inom spelgrafik och som något kryptiskt kallas z-buffer.

En enkel 3D-scen (vänster) och dess z-buffer (höger)
När man renderar en bild i ett spel skapar grafikprocessorn automatiskt även ytterligare en bild som aldrig visas. Denna bild innehåller, för varje pixel, bara ett värde som säger hur långt ifrån betraktaren det som är i just den pixeln är. Ett avstånd kort och gott. Detta används för att se till att saker som är längre bort än den aktuella pixeln inte ritas ut, och att saker som är närmare skriver om i bilden så det nya djupet lagras. Detta så att det hela tiden är det som är närmast betraktaren som syns i bild. Denna bild kallas för z-buffer - eller djupbuffer på svenska. Det är även en sådan bild som Kinectkameran skapar, fast då istället från att läsa av verkligheten och inte ifrån massa matematiska polygoner i datorns minne. På senare tid har man kommit på att denna bild även kan användas till andra saker än att bara betsämma vad som skall ritas ut och inte. Exempelvis används det för att skapa skuggeffekter (ambient occlusion) och för ljussättning (global illumination). Mycket troligt är även att Alan Wake har hjälp av den vid skapandet av sina atmosfäriska effekter.
När det kommer till stereoskopisk 3D så kan man använda djupbuffern till att skapa en andra bild för det andra ögat med hjälp av djupet i de olika pixlarna. I stort är det ju faktiskt så att skillnaden mellan två bilder skapade av två kameror med liten förskjutning åt sidan är att saker som ligger nära kameran förskjuts åt sidan mer än det som ligger långt bort. Tänk dig hur det är när du åker tåg. Saker nära svischar förbi fönstret i snabbt tempo medan saker borta vid horisonten ser ut att stå helt stilla. Så för att skapa bilden för andra ögat så flyttar man helt enkelt pixlarna som ligger nära enligt djupbuffern lite lätt åt ena hållet och saker som ligger långt bort enligt djupbuffern lite mindre. Rent tekniskt hur detta går till för att undvika massa hål i bilden kommer jag inte gå in på nu, men kort kan man säga att det finns en rad sätt att göra detta på. Det som är värt att veta är att detta går att göra väldigt snabbt på grafikkorten eller på en av PS3:ans hjälpprocessorer. Crytek säger själva att i Crysis 2 så står skapandet av denna extra bild för enbart ungefär 1,5% av renderingstiden. Så det är i stort sett gratis. Dessutom, när man väl fått det att fungera så är det relativt lite extraarbete som behövs för att få det att fungera i spelet. Det var exempelvis svårare att gå över till bra high-dynamic range rendering då det krävde mer arbete med texturer och ljussättning.

Crysis 2 blir ett av de första storspelen med stereoskopisk 3D.
En nackdel med ovanstående teknik är dock att det inte fungerar med genomskinliga objekt. Inte alls. Det betyder att rök, explosioner och liknande måste renderas två gånger på vanligt vis efter det att man skapat sin andra bild. Det är dock en fraktion av kostnaden av att rendera hela bilden två gånger. Gränssnitt som ligger ovanpå bilden behöver också renderas två gånger. Helst vill man ju dock att gränssnittet är så lättläst som möjligt och man placerar det då på ett sådant sätt i bilden att det ser likadant ut i de båda bilderna.
Vilket osökt tar mig till nästa punkt i mitt försvar för stereoskopisk 3D. Med prestandafrågan ur bild så är nästa problem med 3D att många upplever den som lite obekväm att titta på. Varför och vad kan man göra åt det? Läs om detta i nästa del.
Mycket intressant analys och teknikgenomgång! Bravo!
Jag är nyfiken på det du utlämnade: Vad man fyller ut hålrummet bakom förskjutningarna med? Sträcka ut bakgrunden? Rendera om de pixlarna?
Jag tror ju också att alla sportspel plussas av 3D, precis som sport på 3D-TV borde göra det lättare att följa bollarnas och puckarnas rörelse i luften.
För övrigt: strålande Crysis 2-bild med de rödgröna glasögonen!
Först vill jag säga att ovanstående text är välgrundade spekulationer, men dock ändå spekulationer. De kanske gör på ett helt annat sätt, men det är dock, erfarenhetsmässigt, det bästa sättet att göra det på.
När det gäller hålen så kan man antingen göra allt till ett heightfield med zbuffern som höjdkurva och tendera det. Då blir hålen utfyllda av en övergång mellan förgrund och bakgrund. Funkar bra då andra bilden hjälper till. Och det är väldigt lite förskjutning och det är saker som rör sig.
Ett annat alternativ är mycket riktigt att repetera den sista pixeln innan hålet. Blir godkännt det med. Vi har på jobbet gjort båda dessa metoder, främst den första, för saker som gått upp på bio, så det är nog så bra.
Finns säkert fler metoder än så. Det är väldigt förlåtande det där. Det andra ögat hjälper till mycket och räddar. Även färger och motiv hjälper hjärnan att godta det man ser.
Jätteintressant!
Jag har inte haft tid att läsa igenom dina 3D artiklar tidigare. Men nu ångrar jag att jag väntade.
Och precis som (R) säger, underbart söt bild på rymdvarelsen med de rödgröna glasögonen.
Oskar Källner bloggade nyligen: Att träffa det man siktar på