Hei, alle sammen! Forrige semester skrev vi at veien videre handlet om å blant annet legge til rette for mindre prosjekter. Det er nettopp det som har skjedd: Dette semesteret har vi startet tre nye delprosjekter, hvert drevet av ett medlem.
Spørsmålet “hva er egentlig en shader?” har vi fortsatt ikke et fullgodt svar på. De tre prosjektene viser kanskje bedre enn noen definisjon hvor mye det rommer: gjenskapning av en fluidsimulering fra data, et prosedyregenerert utforskningsspill og 3D-rekonstruksjon fra bilder. Felles for dem er at de utnytter at GPU-en kan gjøre enormt mange beregninger parallelt.
Frederik – Posterior Flows
Hva om en simulering kunne se noen få glimt av vann i bevegelse, og selv finne ut hvor tyktflytende vannet er og hva som skjer videre?
Det er tanken bak det jeg bygger, en digital tvilling. Det er en modell som følger med på et ekte system og justerer seg etter det den ser, litt som en værmelding som oppdateres hver gang det kommer nye målinger. Foreløpig er jeg ikke der at jeg styrer på med en vanntank full av sensorer, jeg fokuserer først og fremst på simuleringen. Én kjøring er “virkeligheten”, med parametre jeg kjenner, men later som jeg ikke vet. Så prøver modellen å gjette seg tilbake til dem. Gjetningen foregår omtrent slik: velg en verdi, kjør simuleringen, se hvor godt den passer med “virkeligheten”, oppdater det man vet og prøv igjen. Dette kalles dataassimilasjon, og brukes blant annet i GPS og værmelding. Etter mange nok runder sirkler gjetningene seg inn mot det man ønsker å vite.
Så hvor kommer shaderne inn i bildet? Det korte svaret er de mange og parallelliserbare beregningene som må gjøres, da det er mange parametre å forholde seg til, det er der GPU-en kommer inn i bildet.
Til nå har jeg laget flere av de essensielle komponentene jeg skal bruke for å gjennomføre dataassimilasjon, men ikke enda for et fluidsystem, men et system med lignende trekk som er enklere å forholde seg til. Dette er naturligvis det neste store steget videre for mitt prosjekt.
Under er et bilde av hvordan dette ser ut for en fluidsimulering (hentet fra denne artikkelen ). Dataassimilasjon kombinerer modellen sin prediksjon (her “CFD”) med måledata (her “experiments”) for å finne et svar som er nærmere virkeligheten enn hver av de to isolert sett.
Vangen – Peregrination
Underprosjektet Peregrination (vandring/ferd/reise) har til hensikt å være et prosedyregenerert oppdagelsesspill. Det er i all hovedsak et biprodukt av prosessen for å lære OpenGL og vil være mer et proof of concept enn et fullverdig spill.
I spillet utforsker du en prosedyrisk generert postapokalyptisk fantasy-verden med ulike biomer, strukturer og NPCer. Terrenget genereres ved hjelp av layered noise teksturer, og vil påvirke hvor ulike strukturer vil kunne plasseres. I og rundt strukturer vil det være mulig å snakke med NPCer og lese skilt som avslører en liten bit med lore av gangen slik at du selv kan finne ut av hva det er som har skjedd. Strukturer vil være modellert i Blender og importert inn i spillet. Det er ikke planlagt noe kampsystem eller inventar/items.
Foreløpig følger prosjektet kun utviklingsløpet til LearnOpenGL siden, og vil gjøre det fram til kurset er gjennomført. Det er derfor ikke blitt gjort noe særlig arbeid mot spillet i seg selv. Når den tid kommer vil øverste prioritet bli å lage et navigerbart plan med enkel bevegelse og lys som et MVP og etter det utvides med prosedyrisk generert terreng, strukturer, etc.
Elias – Fra 2D-bilder til 3D med Gaussian Splatting
Hvordan kan man rekonstruere en tredimensjonal scene ut fra vanlige todimensjonale fotografier? Dette er et problem det har blitt forsket på lenge, og de siste årene har en metode kalt 3D Gaussian Splatting (3DGS) skilt seg spesielt ut.
3DGS kan oppnå bildekvalitet sammenlignbar med avanserte nevrale representasjoner, som Neural Radiance Fields (NeRF), men med betydelig kortere treningstid. Når modellen er ferdig trent, kan den generere bilder fra nye synsvinkler i sanntid. Dette kalles Novel View Synthesis (NVS) og gjør det mulig å utforske en rekonstruert scene virtuelt.
Målet med prosjektet mitt er å utvikle en komplett pipeline fra et sett med bilder til en interaktiv 3D-representasjon, rendret ved hjelp av compute shaders kjørt på en GPU. Først ønsker jeg å lage en Minimum Viable Product (MVP) ved hjelp av eksisterende biblioteker, før jeg gradvis erstatter disse med egne implementasjoner.
Først brukes Structure from Motion (SfM) til å identifisere samsvarende punkter på tvers av bildene. Disse brukes til å estimere kameraenes relative posisjoner og triangulere punktenes koordinater i et felles tredimensjonalt koordinatsystem. Til dette bruker jeg foreløpig COLMAP, og har nå rekonstruert en punktsky med 803 punkter fra 33 bilder, med en gjennomsnittlig reprojeksjonsfeil på 0,54 piksler.
Deretter brukes punktskyen til å initialisere 3DGS-modellen, hvor hvert punkt representeres av en tredimensjonal Gauss-fordeling med blant annet posisjon, størrelse, orientering, farge og gjennomsiktighet. Modellen trenes ved hjelp av gradientbasert optimalisering, der parameterne justeres for å minimere forskjellen mellom de originale fotografiene og bildene modellen genererer.
Til slutt skal jeg utvikle en egen renderer som projiserer Gauss-fordelingene ned på et todimensjonalt bildeplan. Ved hjelp av compute shaders kan store deler av beregningene utføres parallelt på GPU-en.
Veien videre
Når pipelinen fungerer, ønsker jeg å rekonstruere Hackerspace-kontoret og lage en interaktiv modell man kan bevege seg rundt i. På sikt hadde det vært spesielt interessant å gjøre dette tilgjengelig direkte på nettsiden vår, dersom DevOps er behjelpelige.
Avsluttende ord
Neste semester fortsetter vi arbeidet, med mål om å ha en fungerende versjon av alle tre prosjektene før sommeren. Det betyr ikke nødvendigvis at de er ferdige, men at hvert av dem skal kunne vises frem.
- ShaderGruppa