Rendering är nyckeln till framgångsrik 3D-grafik, men få användare har mycket koll på vad det innebär – och det av mycket goda skäl, eftersom den underliggande teorin är mycket teknisk och implementeringen komplex. Men för att ta full kontroll över denna avgörande process måste du förstå de grundläggande principerna i arbetet. Så här är en mycket förenklad guide, från grundläggande strålkastning till dagens toppmoderna globala belysning, bildbaserad belysning och omgivande ocklusion.
Återgivning, precis som människans syn, handlar om ljus: någon ljuskälla avger fotoner som studsar runt mellan verkliga objekt, av vilka några så småningom landar på näthinnan i ditt öga. Problemet med datoriserad rendering är att det finns ofattbart många fotoner som surrar runt om i världen framför dig, och de kan inte alla inkluderas i en 3D-modell. Men eftersom ljus färdas i förutsägbara raka linjer, eller strålar, kan en 3D-applikation göra omvänd konstruktion av scenen och spåra endast den lilla bråkdel av strålarna som faktiskt kommer in i betraktarens öga – det vill säga bara de som passerar genom varje pixel i bild på skärmen på väg till betraktarens öga eller ”kamera”. Effektivt behandlas kameran som om den vore en ljuskälla som kastar strålar genom skärmens pixelrutnät (eller bitmappen om du inte renderar direkt till skärmen) som sedan träffar de närmaste objekten. Varje renderat pixelvärde baseras sedan på ljusets interaktion med materialegenskaperna vid den kontaktpunkten. Denna rygg-mot-framsida, öga-först, strålkastande tillvägagångssätt skär bort mer än 99,9 procent av alla beräkningar och gör dator 3D-rendering möjlig.
Men det är fortfarande en långt ifrån enkel operation. Säg att du renderar en scen på 800 x 600 som innehåller 30 objekt: innan varje pixels färg kan beräknas måste varje objekts geometri testas mot varje strålkastning för att avgöra vilken punkt som är närmast ögat. Detta kräver cirka 14 400 000 (800 x 600 x 30) komplexa korsningstester! Att bryta ner scenen i block kan minska en del onödig bearbetning, men det är inte konstigt att rendering är den perfekta tiden att gå och sätta på vattenkokaren…
Och strålkastning är bara början – renderingen blir mycket mer komplex och tidskrävande. Kvaliteten på en enkel rendering som denna skulle vara oacceptabelt dålig på grund av en taggig trappstegseffekt längs alla kanter som inte är helt horisontella eller vertikala. Lösningen är att kantutjämna scenen genom att dela upp varje pixel i subpixlar – var som helst mellan 2 x 2 och 64 x 64, beroende på önskad noggrannhet – och sedan räkna ut den returnerade färgen för var och en och beräkna ett genomsnitt av dem. Om detta måste göras för varje pixel kan du lika gärna bara öka bildens övergripande dimensioner och ta en enorm prestandaträff, men kantutjämning kan tillämpas intelligent under en sista renderingspassering, baserat på scenens geometri och, vid behov, på skarpa färggränser.
Kantutjämning ger ett jämnare resultat, men ett resultat som fortfarande saknar realism – i en rå raycast-rendering ser allt platt och onaturligt ut eftersom det inte finns någon ljusinteraktion mellan objekten i scenen. Till att börja med finns det inga reflektioner, vilket är mycket mer betydelsefullt än man kan tro. Titta runt dig nu och du kommer att se att det inte bara är speglar som reflekterar, utan varje blank yta: metall, polerat trä, keramik, glas och så vidare. För att återge reflektioner måste renderaren följa varje kaststråle vidare, bortom det första objektet det träffar och vidare till objektet som det studsade av innan dess. Denna utvidgning av strålgjutningsprincipen kallas strålspårning. Eftersom ljus färdas i raka linjer är det matematiskt enkelt att räkna ut i vilken riktning man ska skicka varje sekundär reflektionsstråle, baserat på vinkeln med vilken den primära strålen träffade den reflekterande ytan. Denna skärningssökande reflektionsstråle används för att hitta den närmaste punkten i den nya riktningen, och färgen på detta sekundära prov beräknas och matas tillbaka till beräkningen för det primära provet. Skulle den sekundära strålen träffa en annan reflekterande yta, upprepas denna process helt enkelt rekursivt tills ett fast antal sekundära strålar (stråldjupet) överskrids, eller dess bidrag till det slutliga pixelvärdet faller under en viss tröskel.