Teksturering Mer om Grafisk Databehandling Øker detaljgraden uten å øke antall grafiske primitiver. Grafiske primitiver brukes som bærere for bilder (f.eks. fotografier). INF2340 / V04 2 Eksempel Et annet eksempel Alternativ Alternativ 2 Bruk ett polygon for hver endring/fasett i bildet. F Ressurskrevende! "Klistre" bildet på kun ett polygon. F Teksturering! INF2340 / V04 3 INF2340 / V04 4
Hovedstegene i teksturering Steg ) Definer teksturen. En tekstur er en samling av teksturelementer - kalt texel er - organisert i en matrise som enten er D, 2D, eller 3D. En texel inneholder informasjon om farge og transparens. Steg 2) Angi hvordan teksturen skal påvirke hvert pixel. All farge kommer fra teksturen, eller Teksturfargen blandes med eller påvirker den underliggende fargen (nødvendig for å få med belysning!) Leses typisk inn fra en fil! INF2340 / V04 5 INF2340 / V04 6 Steg 3) Angi teksturkoordinater for noder i geometriske primitiver. Teksturkoordinater typisk normaliserte, dvs. definert i intervallet [0, ]. 0 0 Fordi det er såpass nyttig er teksturering ofte implementert i maskinvare! (0.2, 0.8) (0.36, 0.2) (0.9, 0.87) INF2340 / V04 7 INF2340 / V04 8 2
Transparens Skal se på et vanlig spesialtilfelle: (helt eller delvis) gjennomsiktige objekter uten brytning Noen anvendelser: halvgjennomsiktig bilvindu helgjennomsiktig del av tekstur Alfa Transparens representeres vanligvis som en alfaverdi (A, α) som betyr opasitet (ugjennomsiktighet). Alfa varierer fra 0 (helt gjennomsiktig) til (helt ugjennomsiktig). Alfa spesifiseres vanligvis sammen med farge: RGBA (f.eks. polygon-node eller texel (teksturelement)) INF2340 / V04 9 INF2340 / V04 0 Interpolert blanding av farger (vanlig modell) 3 Generelt 2 0 = Global bakgrunn Lysstråle mot øyet Forgrunnsobjekt Farge = I FG Opasitet = α FG Bakgrunnsobjekt Farge = I BG Opasitet = irrelevant! I 3 α 3 I 2 α 2 I α I 0 α 0 = Resultatfarge: I = α FG I FG + ( α FG )I BG 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.) I i = α i I i + ( - α i )I i-, i I 0 = I 0 I i = Fargen som er resultatet av å blande objekt 'i' med det som ligger bakenfor, altså I i-. INF2340 / V04 INF2340 / V04 2 3
Observasjon Ett enkelt objekt med α = er tilstrekkelig for å skjule alt bakenfor. α = α = 0 skjules! Hvis alle objekter har α < vil alle objekter med α > 0 bidra til den endelige fargen. α = α = 0 vil også bidra! INF2340 / V04 3 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 4 Noen eksempler (laget med PovRay - www.povray.org) INF2340 / V04 5 INF2340 / V04 6 4
Essensen i RT Hvilke lysstråler treffer øyet, og hvor kommer de fra? Ide : 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 7 INF2340 / V04 8 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. Transparent objekt pixel = primær stråle = reflektert stråle = brutt stråle = skyggestråle = normalvektor INF2340 / V04 9 INF2340 / V04 20 5
RT - Pseudokode for <hvert pixel p> { ray = <strålen fra øyepunktet gjennom p> fargen i p = RT_trace(ray, ) procedure RT_trace(ray, depth) { if <skjæring med et objekt> return RT_shade(..., depth) else return <bakgrunnsfargen> 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 + ) if <objektet er transparent> color += RT_trace(<brytningsstrålen>, depth + ) return color INF2340 / V04 2 INF2340 / V04 22 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 = r 2 Gir 2. gradslikning for t røtter r (a, b, c) Polygon Finn skjæringspunktet (hvis det eksisterer) mellom strålen og planet polygonet ligger i. Projiser skjæringspunktet og polygonet ned på xy-, xzeller yz-planet. Sjekk om punktet er inne i polygonet (2D problem - enklere). y x z INF2340 / V04 23 INF2340 / V04 24 6
Parametriske flater (splines etc.) Ressurskrevende skjæringsalgoritme! Kontrollpunkter 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 25 INF2340 / V04 26 RT-optimalisering 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 RT-optimalisering 2 Del bildet opp i n forskjellige utsnitt og la n prosessorer beregne hvert sitt utsnitt i parallell. 2 2 Prosessor Prosessor 2 Prosessor 3 Prosessor 4 INF2340 / V04 27 INF2340 / V04 28 7
Animasjon Å vise en sekvens med bilder etter hverandre i rask rekkefølge. Kino: Chaplin: 6 bilder / sek Moderne filmer: 24 bilder / sek Dataskjerm: 60-20 bilder / sek To typer animasjon på datamaskin Manuell (f.eks. ved interaktiv endring av kamera) Automatisk (tradisjonell film) INF2340 / V04 29 INF2340 / V04 30 Basisalgoritme for animasjon med 24 bilder / sek for (i = 0; i < n; i++) { <Slett bilde> <Tegn bilde> <Vent til /24 sek har passert> Problem ser kun delvis ferdig bilde S T V tid først her ser vi det ferdige bildet /24 sek Resultat: flimring og blinking! INF2340 / V04 3 INF2340 / V04 32 8
Løsning: Dobbeltbuffer Buffer Buffer 2 RGB-buffer 2 RGB-buffer Z-buffer Buffer vises på skjermen Buffer 2 vises på skjermen Buffer vises på skjermen? Video controller for (i = 0; i < n; i++) { <Slett bilde> <Tegn bilde> <Bytt om på bufferne> <Vent til /24 sek har passert> INF2340 / V04 33 INF2340 / V04 34 9