340 likes | 465 Views
Mer om Grafisk Databehandling. Teksturering. Øker detaljgraden uten å øke antall grafiske primitiver. Grafiske primitiver brukes som “bærere” for bilder (f.eks. fotografier). Eksempel. Alternativ 2. Alternativ 1. Bruk ett polygon for hver endring/fasett i bildet. Ressurskrevende!.
E N D
Teksturering • Øker detaljgraden uten å øke antall grafiske primitiver. • Grafiske primitiver brukes som “bærere” for bilder (f.eks. fotografier). INF2340 / V04
Eksempel Alternativ 2 Alternativ 1 Bruk ett polygon for hver endring/fasett i bildet. Ressurskrevende! "Klistre" bildet på kun ett polygon. Teksturering! INF2340 / V04
Et annet eksempel INF2340 / V04
Hovedstegene i teksturering • Steg 1) Definer teksturen. En tekstur er en samling av teksturelementer - kalt texel’er - organisert i en matrise som enten er 1D, 2D, eller 3D. En texel inneholder informasjon om farge og transparens. Leses typisk inn fra en fil! INF2340 / V04
All farge kommer fra teksturen, eller • Teksturfargen blandes med eller påvirker den underliggende fargen (nødvendig for å få med belysning!) • Steg 2) Angi hvordan teksturen skal påvirke hvert pixel. INF2340 / V04
Teksturkoordinater typisk normaliserte, dvs. definert i intervallet [0, 1]. • Steg 3) Angi teksturkoordinater for noder i geometriske primitiver. 1 0 0 1 (0.2, 0.8) (0.9, 0.87) (0.36, 0.2) INF2340 / V04
Fordi det er såpass nyttig er teksturering ofte implementert i maskinvare! INF2340 / V04
Transparens • Skal se på et vanlig spesialtilfelle: • (helt eller delvis) gjennomsiktige objekter uten brytning • Noen anvendelser: helgjennomsiktig del av tekstur halvgjennomsiktig bilvindu INF2340 / V04
Alfa • Transparens representeres vanligvis som en alfa-verdi (A, ) som betyr opasitet (ugjennomsiktighet). • Alfa varierer fra 0 (helt gjennomsiktig) til 1 (helt ugjennomsiktig). • Alfa spesifiseres vanligvis sammen med farge: RGBA (f.eks. polygon-node eller texel (tekstur-element)) INF2340 / V04
Merk: Nye objekter må blandes inn i retning mot øyet ("back-to-front")! (Begynn med det som er lengst vekk, bland inn det som er nest-lengst vekk osv.) Interpolert blanding av farger(vanlig modell) Lysstråle mot øyet Bakgrunnsobjekt Forgrunnsobjekt Farge = IBG Opasitet = irrelevant! Farge = IFG Opasitet = FG Resultatfarge: I = FGIFG + (1 – FG)IBG INF2340 / V04
2 3 0 = Global bakgrunn 1 I2 I3 I0 I1 ´ ´ Ii = iIi + (1 - i)Ii-1 , i 1 ´ Ii = 0 = 1 1 2 3 Fargen som er resultatet av å blande objekt 'i' med det som ligger bakenfor, altså Ii-1. ´ I0 = I0 ´ Generelt INF2340 / V04
= 1 = 0 skjules! Observasjon • Ett enkelt objekt med = 1 er tilstrekkelig for å skjule alt bakenfor. • Hvis alle objekter har < 1 vil alle objekter med > 0 bidra til den endelige fargen. = 1 = 0 vil også bidra! INF2340 / V04
“Ray Tracing” (RT) • Mer “fotorealistisk” sjatteringsalgoritme. • Tar bedre hensyn til hvordan også andre objekter (og ikke bare lyskilder) kan påvirke belysningen av et punkt: • Refleksjon. • Skygger. • Kan også modellere transparente objekter. • Spesielt egnet for speilende refleksjon (andre metoder er bedre på diffus refleksjon) INF2340 / V04
Noen eksempler(laget med PovRay - www.povray.org) INF2340 / V04
Essensen i RT • Hvilke lysstråler treffer øyet, og hvor kommer de fra? • Ide 1: Følg alle lysstråler fra alle lyskilder og ta vare på dem som (direkte eller indirekte) treffer øyet. UMULIG! • Ide 2: Ta utgangspunkt i lysstrålene som faktisk treffer øyet. Følg dem bakover til dit de kom fra! INF2340 / V04
RT - Overordnet algoritme • Send ut en stråle fra øyepunktet gjennom hvert pixel og videre innover mot objektene (antar disse allerede er transformert til synskoordinater). • Avgjør om en stråle skjærer et objekt, og i såfall hva fargebidraget fra skjæringspunktet blir. ( RT er en bilderekkefølge algoritme!) • En del av dette fargebidraget kan evt. regnes ut ved å sende ut nye stråler rekursivt fra et punkt for å modellere speilende refleksjon og brytende transparens. INF2340 / V04
= primær stråle = reflektert stråle = brutt stråle = skyggestråle Transparent objekt = normalvektor pixel INF2340 / V04
RT - Pseudokode for <hvert pixel p> { ray = <strålen fra øyepunktet gjennom p> fargen i p = RT_trace(ray, 1) } procedure RT_trace(ray, depth) { if <skjæring med et objekt> returnRT_shade(..., depth) else return <bakgrunnsfargen> } INF2340 / V04
procedure RT_shade(..., depth) { color = omgivelse-lys for <hver lyskilde> { finn ut (vha. skyggestråler) i hvilken grad lyset er blokkert av andre objekter og skalér leddene for diffus og speilende refleksjon tilsvarende før disse adderes til color } if depth > maxDepth return color if <objektet er reflekterende> color+= RT_trace(<refleksjonsstrålen>, depth + 1) if <objektet er transparent> color += RT_trace(<brytningsstrålen>, depth + 1) return color } INF2340 / V04
Skjæringsalgoritmer essensielle i RT! • Parametrisert uttrykk for stråle gjennom pixel x = x(t), y = y(t), z = z(t), t 0 • Kule (x – a)2 + (y – b)2 + (z – c)2 = r2 Gir 2. gradslikning for t røtter (a, b, c) r INF2340 / V04
y x z • Polygon • Finn skjæringspunktet (hvis det eksisterer) mellom strålen og planet polygonet ligger i. • Projiser skjæringspunktet og polygonet ned på xy-, xz- eller yz-planet. • Sjekk om punktet er inne i polygonet (2D problem - enklere). INF2340 / V04
Kontrollpunkter • Parametriske flater (splines etc.) Ressurskrevende skjæringsalgoritme! INF2340 / V04
RT er ressurskrevende! • I prinsippet må vi sjekke skjæring for alle stråler (primære, reflekterte, brutte og skygge-) mot alle objekter. • En skjæringsalgoritme kan i seg selv være ressurskrevende. • Belysningsmodellen må evalueres i alle skjæringspunkter. INF2340 / V04
RT-optimalisering 1 • Pakk objektene inn i omsluttende volumer (“bounding volumes”) med enklere (billigere) skjæringsalgoritme. • Hvis en stråle ikke skjærer et omsluttende volum, vil den heller ikke skjære noen av objektene inne i volumet! 2 2 2 1 2 1 1 1 INF2340 / V04
Prosessor 1 Prosessor 2 Prosessor 3 Prosessor 4 RT-optimalisering 2 • Del bildet opp i n forskjellige utsnitt og la n prosessorer beregne hvert sitt utsnitt i parallell. INF2340 / V04
Animasjon • Å vise en sekvens med bilder etter hverandre i rask rekkefølge. • Kino: • Chaplin: 16 bilder / sek • Moderne filmer: 24 bilder / sek • Dataskjerm: • 60-120 bilder / sek INF2340 / V04
To typer animasjon på datamaskin • Manuell (f.eks. ved interaktiv endring av kamera) • Automatisk (tradisjonell film) INF2340 / V04
tid Basisalgoritme for animasjon med 24 bilder / sek for (i = 0; i < n; i++) { <Slett bilde> <Tegn bilde> <Vent til 1/24 sek har passert> } S T V 1/24 sek INF2340 / V04
Problem ser kun delvis ferdig bilde først her ser vi det ferdige bildet Resultat: flimring og blinking! INF2340 / V04
Video controller Løsning: Dobbeltbuffer Z-buffer RGB-buffer 2 RGB-buffer 1 ? INF2340 / V04
Buffer 1 Buffer 2 Buffer 1 vises på skjermen Buffer 2 vises på skjermen Buffer 1 vises på skjermen for (i = 0; i < n; i++) { <Slett bilde> <Tegn bilde> <Bytt om på bufferne> <Vent til 1/24 sek har passert> } INF2340 / V04