Skuggning

Gouraud-skuggning, som utvecklades av Henri Gouraud 1971, var en av de första skuggningsteknikerna för 3D-datorgrafik.

I datorgrafik avser skuggning processen att ändra färgen på ett objekt/yta/polygon i 3D-scenen, baserat på saker som (men inte begränsat till) ytans vinkel mot ljuset, dess avstånd från ljuset, dess vinkel mot kameran och materialegenskaper (t.ex.t.ex. dubbelriktad reflektionsfördelningsfunktion) för att skapa en fotorealistisk effekt.

Shading utförs under renderingsprocessen av ett program som kallas shader.

Ytans vinkel mot en ljuskällaRedigera

Shading ändrar färgerna på ytorna i en 3D-modell baserat på ytans vinkel mot en eller flera ljuskällor.

I den första bilden nedan har lådans ytor renderats, men alla i samma färg. Kantlinjer har renderats här också vilket gör bilden lättare att se.

Den andra bilden är samma modell renderad utan kantlinjer. Det är svårt att se var en sida av lådan slutar och nästa börjar.

I den tredje bilden har skuggning aktiverats, vilket gör bilden mer realistisk och gör det lättare att se vilken sida som är vilken.

Renderad bild av en låda. Bilden har ingen skuggning på ytorna, utan använder istället kantlinjer (även kallade wireframe) för att separera ytorna och en kraftigare kontur för att separera objektet från bakgrunden.

Detta är samma bild med linjerna borttagna; den enda indikationen på den inre geometrin är punkterna i objektets siluett.

Detta är samma objekt som renderas med platt skuggning. Färgen på de tre synliga framsidorna har ställts in baserat på deras vinkel (bestämd av normalvektorn) mot ljuskällorna.

Typer av belysningRedigera

Skuggningseffekter från ett strålkastarljus med hjälp av en ray tracer

När en shader beräknar resultatets färg, använder den en belysningsmodell för att bestämma mängden ljus som reflekteras vid specifika punkter på ytan. Olika belysningsmodeller kan kombineras med olika skuggningstekniker – medan belysningen säger hur mycket ljus som reflekteras bestämmer skuggningen hur denna information används för att beräkna slutresultatet. Den kan till exempel beräkna belysningen endast vid specifika punkter och använda interpolation för att fylla ut resten. Shadern kan också besluta om hur många ljuskällor som ska beaktas osv.

Ambient lightingEdit

En ambient ljuskälla representerar en ljuskälla med omni-direktionell, fast intensitet och fast färg som påverkar alla objekt i scenen lika mycket (är omni-present). Under rendering lyses alla objekt i scenen upp med den angivna intensiteten och färgen. Den här typen av ljuskälla används huvudsakligen för att ge scenen en grundläggande bild av de olika objekten i den. Detta är den enklaste typen av belysning att implementera och modellerar hur ljus kan spridas eller reflekteras många gånger, vilket ger en enhetlig effekt.

Ambient lighting kan kombineras med ambient occlusion för att representera hur exponerad varje punkt i scenen är, vilket påverkar hur mycket omgivande ljus den kan reflektera. Detta ger en diffus, icke-riktad belysning i hela scenen som inte kastar några tydliga skuggor, men där slutna och skyddade områden mörkläggs. Resultatet liknar vanligtvis visuellt en mulen dag.

PunktbelysningRedigera

Ljuset kommer från en enda punkt och sprids utåt i alla riktningar.

SpotlightingRedigera

Modellerar en spotlight: ljuset kommer från en enda punkt och sprids utåt i en kon.

OmrådesbelysningRedigera

Ljuset kommer från ett litet område på ett enda plan. (En mer realistisk modell än en punktljuskälla.)

RiktningsbelysningRedigera

En riktningsbelysning belyser alla objekt lika mycket från en given riktning, som en områdesljuskälla av oändlig storlek och oändligt avstånd från scenen; det finns skuggning, men det kan inte finnas något avfallsavstånd. Detta är som solen.

Distance falloffEdit

Två lådor renderade med OpenGL. (Observera att färgen på de två framsidorna är densamma även om den ena är längre bort.)

Samma modell renderad med ARRIS CAD, som implementerar distansfall för att göra ytor som är närmare ögat ljusare.

Teoretiskt sett belyses två ytor som är parallella i stort sett lika mycket från en avlägset liggande oblockerad ljuskälla, till exempel solen. Effekten distansfall ger bilder som har mer skuggning och som därför skulle vara realistiska för närliggande ljuskällor.

Den vänstra bilden använder sig inte av distansfall. Lägg märke till att färgerna på de två lådornas framsidor är exakt likadana. Det kan tyckas att det finns en liten skillnad där de två ansiktena direkt överlappar varandra, men detta är en optisk illusion som orsakas av den vertikala kanten nedanför där de två ansiktena möts.

Den högra bilden använder sig av distansfalloff. Lägg märke till att framsidan av den närmare rutan är ljusare än framsidan av den bakre rutan. Dessutom går golvet från ljust till mörkt när det kommer längre bort.

BeräkningRedigera

Distansfallet kan beräknas på ett antal olika sätt:

  • Avståndets potens – För en given punkt på ett avstånd x från ljuskällan är den mottagna ljusintensiteten proportionell mot 1/xn.
    • Ingen (n = 0) – Den mottagna ljusintensiteten är densamma oavsett avståndet mellan punkten och ljuskällan.
    • Linjär (n = 1) – För en given punkt på ett avstånd x från ljuskällan är den mottagna ljusintensiteten proportionell mot 1/x.
    • Kvadratisk (n = 2) – Det är så här ljusintensiteten avtar i verkligheten om ljuset har fri väg (dvs. ingen dimma eller något annat i luften som kan absorbera eller sprida ljuset). För en given punkt på ett avstånd x från ljuskällan är den mottagna ljusintensiteten proportionell mot 1/x2.
  • Ett antal andra matematiska funktioner kan också användas.

SkuggningsteknikerRedigera

Under skuggning behövs ofta en ytnormal för belysningsberäkning. Normalen kan beräknas i förväg och lagras för varje vertex i modellen.

Platt skuggningRedigera

Platt skuggning av en texturerad kubik

Här, utvärderas belysningen endast en gång för varje polygon (vanligtvis för den första vertexen i polygonen, men ibland för centroiden för triangelnät), baserat på polygonens ytnormal och på antagandet att alla polygoner är platta. Den beräknade färgen används för hela polygonen, vilket gör att hörnen ser skarpa ut. Detta används vanligtvis när mer avancerade skuggningstekniker är för beräkningskrävande. Spekulära höjdpunkter återges dåligt med platt skuggning: Om det råkar finnas en stor spekulär komponent vid den representativa vertexen ritas den ljusstyrkan jämnt över hela ytan. Om en spekulär höjdpunkt inte faller på den representativa punkten missas den helt och hållet. Följaktligen inkluderas den spekulära reflektionskomponenten vanligtvis inte i beräkningen av flat shading.

Smooth shadingEdit

I motsats till flat shading där färgerna ändras diskontinuerligt vid polygongränserna, med smooth shading ändras färgen från pixel till pixel, vilket resulterar i en jämn färgövergång mellan två intilliggande polygoner. Vanligtvis beräknas värdena först i hörnen och bilinjär interpolation används för att beräkna värdena för pixlar mellan polygonernas hörn. Typer av jämn skuggning inkluderar Gouraud-skuggning och Phong-skuggning.

Gouraud-skuggningRedigera
  1. Bestäm normalvärdet vid varje polygonhöjdpunkt.
  2. Använd en belysningsmodell på varje höjdpunkt för att beräkna ljusintensiteten från höjdpunktsnormalvärdet.
  3. Interpolera höjdpunktsintensiteterna med hjälp av bilinjär interpolation över ytpolygonen.

Problem:

  • Den omständigheten att belysningen endast beräknas i hörnpunkterna gör att felaktigheterna (särskilt när det gäller spekulära höjdpunkter på stora trianglar) kan bli alltför uppenbara.
  • T-övergångar med angränsande polygoner kan ibland resultera i visuella anomalier. I allmänhet bör T-övergångar undvikas.
Phong shadingEdit

Phong shading liknar Gouraud shading, förutom att i stället för att interpolera ljusintensiteterna interpoleras normaler mellan hörnpunkterna och belysningen utvärderas per pixel. Således beräknas de spekulära belysningarna mycket mer exakt än i Gouraud-skuggningsmodellen.

  1. Beräkna en normal N för varje vertex i polygonen.
  2. Med hjälp av bilinjär interpolation beräknas en normal, Ni för varje pixel. (Normalen måste renormaliseras varje gång.)
  3. Använd en belysningsmodell på varje pixel för att beräkna ljusintensiteten från Ni.

Uppskjuten skuggningRedigera

Uppskjuten skuggning är en skuggningsteknik genom vilken beräkningen av skuggningen skjuts upp till ett senare skede genom att rendering sker i två omgångar, vilket potentiellt kan öka prestandan genom att dyrt skuggade pixlar inte kastas bort. Det första passet fångar endast ytparametrar (t.ex. djup, normaler och materialparametrar), det andra utför själva skuggningen och beräknar de slutliga färgerna.:884

Andra tillvägagångssättRedigera

Både Gouraud-skuggning och Phong-skuggning kan implementeras med hjälp av bilinjär interpolation. Bishop och Weimer föreslog att man använder en Taylor-serieexpansion av det resulterande uttrycket från tillämpningen av en belysningsmodell och bilinjär interpolation av normaler. Därför användes polynomisk interpolation av andra graden. Denna typ av tvåkvadratisk interpolation utvecklades ytterligare av Barrera m.fl. där ett polynom av andra graden användes för att interpolera det diffusa ljuset i Phong-reflektionsmodellen och ett annat polynom av andra graden användes för det spekulära ljuset.

Sfärisk linjär interpolation (Slerp) användes av Kuij och Blake för att beräkna både normalen över polygonen, samt vektorn i riktning mot ljuskällan. Ett liknande tillvägagångssätt föreslogs av Hast, som använder quaternioninterpolation av normalerna med den fördelen att normalerna alltid kommer att ha enhetslängd och den beräkningstunga normaliseringen undviks.

Platt vs. smooth shadingEdit

Flat Smooth
Uses the same color for every pixel in a face – usually the color of the first vertex Smooth shading uses linear interpolation of either colors or normals between vertices
Edges appear more pronounced than they would on a real object because in reality almost all edges are somewhat round The edges disappear with this technique
Same color for any point of the face Each point of the face has its own color
Individual faces are visualized Visualize underlying surface
Not suitable for smooth objects Suitable for any objects
Less computationally expensive More computationally expensive