inear

Alla experiment

Skapa, testa och förstå3D, WebGL och spelutveckling

Interior mapping i Unity: falska rum bakom fönster med en shader

Interior mapping låter en platt fasad visa hela rum bakom fönstren. Så fungerar tekniken och så bygger du den i Unity med Shader Graph eller HLSL.

Senast uppdaterad 1 november 2026

Två utvecklare bygger en shader som visar upplysta rum bakom fönstren i en 3D-stad

Interior mapping är en shaderteknik som får en plan husfasad att visa hela rum bakom fönstren, med väggar, golv och tak i rätt perspektiv. Joost van Dongen presenterade tekniken i en artikel år 2008. Den svenska utvecklaren Einar Öberg portade tekniken till Unity3D i februari 2011 som ett av sina första experiment med motorn.

Original
Einar Öbergs portering av Joost van Dongens teknik till Unity
År
Februari 2011, tekniken från 2007 och 2008
Teknik
Unity3D med egen shader, skriptade byggnader och en cykel för dag och natt
Status i dag
Scenen går inte att testa online eftersom koden är skriven för en äldre version av Unity

Den här artikeln förklarar experimentet och tekniken bakom det, men redaktionen har inte återskapat originalet. Informationen baseras på Einar Öbergs egna inlägg från 2011, Joost van Dongens beskrivning av metoden samt de källor som anges längst ner.

Animerad stadsvy i Unity där fönstren visar rum som byter perspektiv när kameran rör sig
Bild från Einar Öbergs ursprungliga inlägg 2011.

Vad bestod experimentet av?

Öberg hade nyligen börjat använda Unity3D och ville lära sig hur shaders fungerar i motorn. Hans strategi var att översätta en teknik från ett annat programmeringsspråk för att lära sig två saker samtidigt. Han valde van Dongens interior mapping som skapar en illusion av djup på en vägg med bara två trianglar. Allt sköttes av en enda shader.

Han byggde en liten stad runt shadern. Byggnaderna genererades procedurellt i ett rutnät med hjälp av skriptade meshes, inspirerade av ett stadsexempel som många Unity-användare kände till på den tiden. Han lade även till gator, trottoarer och gatlyktor. Ett enkelt system för övergång mellan dag och natt blandade två skyboxar och styrde både ljusförhållandena och antalet tända fönster.

Öberg var öppen med projektets brister. Scenen innehöll många punktljus utan optimering. Ljuskartor var enligt vad han förstod en funktion i Unitys betalversion. Varje byggnad krävde en egen instans av shadern, så meshes gick inte att slå ihop. Bildfrekvensen var ändå stabil och hela scenpaketet kunde laddas ner.

Gata i Unity med procedurella byggnader och upplysta fönster på kvällen
Bild från Einar Öbergs ursprungliga inlägg 2011.

Så fungerar interior mapping

Idén är att varje pixel på fasaden räknar ut vad som skulle synas om väggen var borta. Van Dongen utvecklade tekniken 2007 i samband med sitt examensarbete. Han presenterade metoden i artikeln Interior Mapping: A new technique for rendering realistic buildings vid konferensen Computer Graphics International 2008.

  1. StrålenFrån kameran skickas en stråle genom pixeln på fasaden in i byggnaden.
  2. PlanenVåningar och väggar ligger med jämna mellanrum och behandlas som oändliga plan.
  3. TräffpunktenShadern räknar ut var strålen först möter ett tak, ett golv eller en vägg.
  4. TexturenTräffpunkten används som koordinat för att hämta färg ur en rumstextur.

KameranFönstret i den platta fasadenFörsta träffen mot ett plan ger färgen
Förenklad illustration av principen sedd från sidan. Redaktionens egen bild.

Strålen och planen

Shadern använder bara den del av strålen som ligger bakom fasaden. Eftersom tak och väggar sitter med jämna mellanrum räcker det att avrunda strålens startposition uppåt eller nedåt till närmaste våning eller vägg. Det ger rummets gränser utan att någon geometri behövs. Strålens riktning bestämmer vilka plan som kan träffas, så bara tre av rummets sex sidor behöver testas.

Närmaste träff gäller

För varje plan beräknas avståndet längs strålen till skärningspunkten. Det kortaste avståndet avgör vilken yta som syns och träffpunkten blir texturkoordinat. Vid ett tak används de två horisontella koordinaterna medan höjden och djupet används för en sidovägg. Van Dongen optimerade 2007 beräkningarna så att tre skärningar kunde lösas samtidigt, något han i dag ser som mindre viktigt på modern hårdvara.

Begränsningarna

Rummen är lådor med texturer. Möbler och detaljer måste målas in i texturen och ser platta ut på nära håll. Van Dongen nämner fler artefakter, till exempel att samma rum kan se olika ut från olika delar av huset. I bakgrunden av ett spel märks det sällan.

Mottagandet

Öbergs portning till Unity blev en referens för den som ville prova tekniken i motorn. Alan Zucconi nämnde den 2018 i en översikt av interior mapping och påpekade att Unity hade förändrats mycket sedan 2011. Inlägget länkas fortfarande från Unitys diskussionsforum.

Tekniken har fått stort genomslag. Van Dongen skriver i en artikel på Game Developer från 2018 att SimCity från 2013 använde den och att Unreal Engine 4 har den inbyggd via funktionen InteriorCubeMap. Han tror även att Marvel’s Spider-Man använder metoden, men studion har inte bekräftat det.

Går det att bygga det här i 2026?

Ja. Det är enklare än 2011. Den gamla koden är skriven för en Unity-version från tiden före de nya renderingspipelines, så den måste skrivas om. I dag finns två vägar: visuellt i Shader Graph eller som kod i HLSL.

Shader Graph stödjer både Universal Render Pipeline och High Definition Render Pipeline. Strålberäkningen passar bäst i en Custom Function-nod, som tar in egen HLSL-kod i grafen. Den som hellre skriver allt för hand gör det i ett HLSLPROGRAM-block inom en ShaderLab-shader enligt Unitys manual om HLSL.

Byggnader i Unity där varje fönster visar ett rum med väggar och tak i perspektiv
Bild från Einar Öbergs ursprungliga inlägg 2011.

Bygg interior mapping i Unity

Arbeta i objektrymden så att byggnaden kan roteras och flyttas utan att rummen hamnar fel. Stegen nedan fungerar både i Shader Graph och ren HLSL.

1. Positioner

Transformera kamerans och fragmentets position till objektrymden och bestäm strålens riktning.

2. Planen

Använd tecknet på riktningen längs varje axel för att avgöra om det är golv eller tak, vänster eller höger vägg och bakvägg.

3. Avstånden

Avrunda till rummets storlek, beräkna avståndet till varje yta och välj det kortaste.

4. Färgen

Använd träffpunkten som koordinat för att sampla en textur eller cubemap och blanda resultatet med fasaden via en fönstermask.

I Custom Function-noden måste funktionsnamnet i hlsl-filen avslutas med _float eller _half och filen kräver en include-vakt med #ifndef. Flytta startpunkten något inåt i byggnaden så att strålen inte slår mot ytterväggen. Variera rummen med en slumpad textur per rum baserat på rummets heltalskoordinat. Mer information om shaders i webbläsaren finns i Fireshader samt i översikten över serien Visualeyezer.

Vad du kan lära dig av tekniken

Interior mapping visar att det som ser ut som geometri ofta bara är matematik i shadern. Två trianglar och en stråle räcker för att skapa rum i en hel stad.

Experimentet visar också ett bra sätt att lära sig en ny motor. Öberg valde en avgränsad teknik han förstod och byggde en liten värld runt den. Han delade resultatet öppet och bad om kritik. Femton år senare länkas hans port fortfarande från Unitys forum.

Vanliga frågor om interior mapping i Unity

Vem uppfann interior mapping?

Joost van Dongen utvecklade tekniken 2007 och presenterade den på Computer Graphics International 2008. Einar Öberg gjorde en tidig portning till Unity3D 2011.

Behövs någon extra geometri för rummen?

Nej. Fasaden kan bestå av bara två trianglar per vägg. Beräkningen av rummen sker i shadern per pixel.

Går det att använda interior mapping med Shader Graph?

Ja. Lägg strålberäkningen i en Custom Function-nod med HLSL-kod och använd utdatan som koordinat för en rumstextur i grafen.

Varför ser möblerna platta ut?

Varje rum är en låda med texturer på väggar, golv och tak. Möbler måste målas in i texturen eller läggas i extra lager, vilket kostar prestanda.

Kan Öbergs gamla kod användas i dag?

Skriptet skrevs för Unity 2011 och måste skrivas om för dagens renderingspipelines. Grundprincipen är oförändrad.

Källor

Uppgifterna kontrollerades 20 oktober 2026.