En introduktion till OpenGL. Gustav Taxén gustavt@csc.kth.se



Relevanta dokument
Varför behövs grafikbibliotek? Introduktion till OpenGL. OpenGL är ett grafikbibliotek. Fördelar med OpenGL. Allmänt om OpenGL. Nackdelar med OpenGL

OpenGL. grafikbibliotek? Nackdelar med OpenGL. Fördelar med OpenGL. En introduktion till OpenGL. OpenGL. rdvara. Grafikhårdvara.

Avalanche Studios. OpenGL. Vår teknik. Våra spel. Lite inspiration... Stora, öppna spelvärldar. Sandbox-gameplay. Hög audiovisuell standard

OpenGL-översikt. OpenGL. Lokala koordinatsystem. Transformationer. Hierarkiska modeller. Animation. Transformation Byte av koordinatsystem

OpenGL-översikt. OpenGL. Viktigt att komma ihåg: OpenGL-kommandon. OpenGL är en tillståndsmaskin. Transformationer. Geometrispecifikation

OpenGL-översikt. Mer OpenGL. Består-av-hierarki. Hierarkiska modeller. Från hierarki till kod, steg 1. Lokala koordinatsystem

In- och utenheter. Händelsebaserad programmering i GLUT. Interrupt-baserad interaktion. Sampling / polling. Händelsebaserad interaktion (forts.

OpenGL AGI HT05. Gustav Taxén

Spelutveckling 3d-grafik och modellering. Grunder för 3d-grafik Blender Animering

Shaders. Renderingssystem. Renderingssystem. Renderingssystem. Hårdvara för 3D-rendering. Hårdvara för 3D-rendering

Shaders. Gustav Taxén

Transformationer i 3D. Gustav Taxén

OpenGL, Maya och specialeffekter

RTG-formatet Gustav Taxén,

Grafiska pipelinen. Edvin Fischer

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

OpenGL, Maya och specialeffekter

Introduktion till OpenGL

Rastrering och displayalgoritmer. Gustav Taxén

Metoder för att öka realismen vid animerade 3Dförlopp. Master of Science Thesis MARTIN REBAS

Transformationer. Translation. Skalning. Homogena koordinater. Rotation. 2D-grafik. x y. Inom datorgrafik är transformationer den. Många. bevaras.

OpenGL, Maya och specialeffekter

Innehållsförteckning

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

Övningar Dag 2 En första klass

Varför behövs det? I Allegro finns t.ex. stöd för:

2D-grafik. Gustav Taxén

Programmeringsteknik med C och Matlab

Bézierkurvor och parametriska objektrepresentationer

Texturering - förstoring 2(2)

Information Coding / Computer Graphics, ISY, LiTH

Procedurell renderingsmotor i Javascript och HTML5

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

OH-BILDER DATORGRAFIK HT 2005

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Utmatningstekniker Vektoriserade (linjeritande) skärmar

9-1 Koordinatsystem och funktioner. Namn:

2 FRÅN VÄRLD TILL SKÄRM

Rhino3D. Schackbräde. Krav. Några detaljer som kan vara bra att känna till:

1 som går genom punkten (1, 3) och är parallell med vektorn.

Tips och tricks 1 Cadcorp SIS

Innehåll Introduktion... 3 InteractiveScene.config... 3 Scener <scenes>... 3 Typsnitt <fonts>... 3 Övergångar <transitions>...

För att komma igång. Ta skissen från designlabben eller motsvarande och lägg in den i front/side/top fönstret/fönstrena.

Procedurell stad. Projekt i kursen TNM022 Procedurella metoder för bilder. Tobias Heldring, tobhe

TDDI02. Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Introduktion till arv

Skizz till en enkel databas

(8) OpenGL-Pipeline. Vorlesung Computergrafik T. Grosch

Kurvor och ytor. Gustav Taxén

Grafik i DrRacket AV TOMMY KARLSSON

Kurvlängd och geometri på en sfärisk yta

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Datorspelsgrafik. Gustav Taxén

Basbyte (variabelbyte)

a), c), e) och g) är olikheter. Av dem har c) och g) sanningsvärdet 1.

Information Coding / Computer Graphics, ISY, LiTH. Compute shaders!! Framtiden för GPU computing eller sen efterapning av Direct Compute?

Tentamen TNM061, 3D-grafik och animering för MT2. Tisdag 3/ kl 8-12 TP51, TP52, TP54, TP56, TP41, TP43. Inga hjälpmedel

Macromedia Flash MX 2004

PROCEDUELL TERRÄNG. Proceduella metoder för bilder (TNM084) Jimmy Liikala Institutionen för teknik och naturvetenskap

Att göra spel med Game Maker. Rum. Grundläggande delar. Gamemaker, dagens föreläsning. Programmeringsmodell

Procedurell Terräng med LOD i OpenGL 4

Att använda pekare i. C-kod

Koordinatsystem och Navigation

Guide till WinJUPOS Av Martin Högberg (2015) SAAF/Solsystemssektionen (

SgLib Simple Graphics Library

1284_omslag.qxd :13 Sida 1 ECDL START OFFICE 2003 Allmän IT Windows XP Word 2003 Outlook 2003

Laboration - Shaders

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Procedurell 3D-eld på grafikkortet

SF1624 Algebra och geometri Tentamen Onsdagen 29 oktober, 2014

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

Ett modelleringsprogram Blender

Effektpedal för elgitarr

Macromedia. Flash 8 Grundkurs.

Observationer rörande omvandling av digitala yttäckande vektordata till rasterformat.

Bemästra verktyget TriBall

Föreläsning 10. ADT:er och datastrukturer

Skinning and Animation

Uppgift 1 ( Betyg 3 uppgift )

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB

Övningsuppgift 8. ArchiCAD 16. Eget Bibliotek ! Med kopieringsrätt för Peder Skrivares skola, Varberg

Kapitel 16 Situationplan... 3

Teknik för avancerade datorspel!

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

2011 Studsvik AB PANORAMA-BILDTAGNING. Tony Björkman

Displaysystem. Hans Brandtberg Saab Avitronics SAAB AVITRONICS

Exam Pen Instruktionsbok

Geometriska transformationer

Smartair System. TS1000 Version 4.23

Objektorienterad programmering

Hjälp vid användning av Geodataportalen

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Svensk bruksanvisning

Eurocode Software AB. CAEBBK25 Skevböjning. Användarmanual

Datorlära 3 Octave Workspace ovh mijlö Skriva text på skärmen Värdesiffror Variabler och typer Strängar Makro Vektorer

Grafiska pipelinens funktion

Objektorienterad programmering D2

Övning från förra gången: readword

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Programmering A. Johan Eliasson

Transkript:

En introduktion till OpenGL Gustav Taxén gustavt@csc.kth.se 2D164 Grafik och Interaktionsprogrammering VT 27

Labb 4 görs på PC! Följ det nya labbpeket - eller: Följ stegen i labbpeket för labb 5 för att kopiera upp katalogen med skalprogrammet från kurskatalogen, men använd katalogen "OpenGL" istället för "shaders". Glöm inte att göra Visual Studio-inställningarna som beskrivs i peket för labb 5!

Vi börjar knyta ihop säcken... Signalbehandling,, aliasing och filter Transformationer och projektioner Animation Händelsebaserad interaktion

OpenGL-komponenter OpenGL Renderingsfunktionalitet. GLU (OpenGL Utility Library) Hjälpfunktioner för bl.a. transformationer. GLX / GLw Sköter datautbyte mellan operativsystemet och OpenGL. GLUT Portabelt bibliotek tredjepartsbibliotek som gömmer systemberoende delar + fönsterhantering + inenheter.

GLUT Mål: att exakt samma OpenGL-kod ska kunna kompileras på alla plattformar! Funktioner: Starta OpenGL. Öppna fönster (eller fullskärm rm). Hantera mus, tangentbord,, joystick, m.m. Timer. Rita boxar, sfärer rer, tekannor, m.m.

GLUT Applikation GLUT Interaktionstoolkit OpenGL Eventhanterare och grafiktoolkit Operativsystem Hårdvara

Minimalt GLUT-program #include <GL/glut.h> void display(void) { /* Rita om fönster med OpenGL */ } Dubbelbuffring och djupbuffert (mer senare) int main(int argc, char *argv[]) { glutinit(&argc, argv); glutinitdisplaymode(glut_double GLUT_DEPTH); glutcreatewindow( My window ); glutdisplayfunc(display); glutmainloop(); return ; Registrera callback } för r omritning

Events i GLUT Events kan indelas i tre typer: Fönster Menyer Globala

Några GLUT-events för fönster Redisplay (måste fångas f av alla fönster) f Reshape Keypress Mouse button Passsive mouse movement Active mouse movement Entry

void display(void) {... } void reshape(int width, int height) {... } int main(int argc, char *argv[]) {... glutcreatewindow( My Window ); glutdisplayfunc(display); glutreshapefunc(reshape);... }

Animation Rita om fönstret regelbundet GLUT har en "idle"- event (global) som skapas automatiskt då inget annat händer Forcera en omritning i en idle-callback: void idle(void) {... glutpostredisplay(); } int main(...) {... glutidlefunc(idle);... }

Animation och dubbelbuffring void display(void) { /* rensa fönstret */ /* rita med OpenGL */... Synlig Gömd } glutswapbuffers(); Synlig Gömd

Översikt över OpenGL TV-signal Hörn Volym Kontrast Bildformat... Normal Färg Transformationsmatris Projektionsmatris... OpenGL Bild och ljud Fragment

Översikt över OpenGL Parametrar (ändras när det behövs vs) Geometri (skickas vid varje omritning) Renderingspipeline Fragment

Översikt över OpenGL GLUT Meddelande: Behov av omritning Fragment Applikation OpenGL Trans- formation Geometri- specifikation Ljussättning Projek- tion Operationer på fragment Modelview- matris Textur- parametrar Projektions- matris Ljussättnings ttnings- parametrar Inställningar förf tester

Översikt över OpenGL Geometri Operationer på hörn Rastrering Operationer på fragment Bilddata Operationer på bildelement Textur- minne Framebuffer: (bildbuffert x 2) Hjälpbuffertar för vissa tester, mer senare)

Geometrispecifikation glbegin(gl_triangles); glvertex3f(1.,.,.); glvertex3f(., 1.,.); glvertex3f(.,., 1.); glend(); z o y o [ 1 1] T [1 1] T [ 1 1] T x o Hörn anges alltid i objektkoordinater. Anger man ingen w-koordinat sätts den till 1.

Transformationer Transformation Projektion Transformation Viewport- transformation

Transformationer Matrisstack Matrisstack Objektkoord. Ögonkoord. Klippkoord. x o y o z o w o x e y e z e w e Modelview- matris Projektions- matris x c y c z c w c x w y w z w Perspektiv- division Viewport- transformation x n y n z n Fönsterkoord. Normerade enhetskoord.

Modelview-matrisen Modelview-matrisen C omvandlar objektkoordinater till ögonkoordinater: v e = Cv o Matrisen C kallade vi för f M T förra föreläsningen! Normaler transformeras också (mer senare). Ljussättning görs g i ögonkoordinater (mer senare).

Projektionsmatrisen Projektionsmatrisen P omvandlar ögonkoordinater till klippkoordinater: v c =Pv e P projicerar hörnen h påp ett bildplan och definierar samtidigt en volym (view volume). Alla primitiver klipps mot denna volym. Kameran sitter i "världsorigo" rldsorigo" " och "tittar" längs l med negativa z-axeln.

Perspektivdivision och viewporttransformation Perspektivdivision: [x n y n z n ] T = [(x c / w c ) (y( c / w c ) (z( c / w c )] T Perspektivdivisionen ger normerade enhetskoordinater i intervallet [-1,[ 1]. Viewport-transformation transformation: : skalning och offset av de normerade enhetskoordinaterna ger fönsterkoordinater. Skalning och offset är i 2D, så z w = z n

void display(void) { glclearcolor(.1,.2,.3, 1.); glclear(gl_color_buffer_bit); glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(.,., -3.); glcolor3f(1., 1., 1.); Rensa fönstret Specificera transformationsmatrisen Sätt aktuell färg } glbegin(gl_triangles); glvertex3f(1.,.,.); glvertex3f(., 1.,.); glvertex3f(.,., 1.); glend(); glutswapbuffers(); Rita en triangel Byt plats på bakre och främre buffer

x kamera y kamera z kamera glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(.,., -3.); = = 1 3 1 1 1 1 1 1 1 z y x t t t T x T y T z T C = I = Identitetsmatrisen C = CT = T t x t y t z

x kamera y kamera z kamera = 1 1 3 1 1 1 1 o o o e e e z y x z y x glbegin(gl_triangles); glvertex3f(1.,.,.); glvertex3f(., 1.,.); glvertex3f(.,., 1.); glend(); [ 1-3 1] T Hörnen i ögonkoordinater......multipliceras med M T......vilket ger triangelns transformerade hörn i ögonkoordinater: [1-3 1] T [ -2 1] T

Transformation är ekvivalent med byte av koordinatsystem! glloadidentity(); gltranslatef(,,-3); glrotatef(5,,1,); gltranslatef(,,3); y kamera glbegin(gl_triangles); glvertex3f(1,,); glvertex3f(,1,); glvertex3f(,,1); z glend(); kamera x kamera

glpushmatrix pushar aktuellt koordinatsystem på stacken. glpopmatrix ersätter aktuellt koordinatsystem med det som finns överst på stacken.

Demo

void reshape(int width, int height) { glmatrixmode(gl_projection); glloadidentity(); gluperspective(45, (GLfloat) width / (GLfloat) height,.5, 1.); glviewport(,, width, height); } int main(int argc, char *argv[]) {... glutcreatewindow( My Window"); glutdisplayfunc(display); glutreshapefunc(reshape);... }

Perspektivprojektion gluperspective(angle, aspect, near, far); y kamera Bildplan angle z kamera x kamera near far

Ortogonalprojektion glortho(left, right, bottom, top, near, far); y kamera Bildplan left, top z kamera x kamera right, bottom near far

I OpenGL flyttar man föremålen så de hamnar framför kameran! glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(.,., -3.); y kamera y T z kamera z T x kamera x T

y världsorigo y flyttbar_kamera z världsorigo x världsorigo Hur gör vi om vi vill kunna flytta kameran och titta på "världens centrum" istället? z flyttbar_kamera x flyttbar_kamera Antag att vi placerar kameran 3 enheter längs med z världsorigo. Vi ritar nu en triangel i "världskoordinater". Vilka "flyttbar-kamera-koordinater" får vi? x y z flyttbar _ kamera flyttbar _ kamera flyttbar _ kamera 1 = x y K z 1 värld värld värld K = 1 1 1 3 1

= 1 3 1 1 1 K x fix_kamera y fix_kamera z fix_kamera x T y T z T y flyttbar_kamera z flyttbar_kamera x flyttbar_kamera x världsorigo y världsorigo z världsorigo = 1 3 1 1 1 T Tydligen är T ekvivalent med att flytta kameran +3 enheter längs med "världs-z"!

I allmänhet gäller att "Flytta världen framför kameran" är ekvivalent med "Flytta kameran åt motsatt håll" glulookat(campos_x, campos_x, campos_x, at_x, at_y, at_z, up_x, up_y, up_z); skapar en sådan "omvänd" matris och multiplicerar den med modelviewmatrisen.

y världsorigo y flyttbar_kamera z världsorigo x världsorigo glulookat(,, 3,,,,, 1, ); z flyttbar_kamera x flyttbar_kamera y T z fix_kamera y fix_kamera z T x fix_kamera x T T = 1 1 1 3 1

Viewport-transformation transformation glviewport(ox, oy, sx, sy); sy (ox, oy) sx

glmatrixmode(), glpushmatrix(), glpopmatrix() gltranslate(), glrotate(), glscale(),... glfrustum(), gluperspective(), glortho(), gluortho2d(),... Objektkoord. Ögonkoord. Klippkoord. x o y o z o w o x e y e z e w e Modelview- matris Projektions- matris x c y c z c w c x w y w z w Perspektiv- division Viewport- transformation x n y n z n Fönsterkoord. Normerade enhetskoord. glviewport()

Hierarkiska modeller Pivotpunkt

Består-av av-hierarki Skelett... Arm Överarm Underarm

Lokala koordinatsystem Subnodens origo positioneras m.a.p. förälderns koordinatsystem.

Från hierarki till kod Skelett Arm void drawskeleton(void) { drawarm(); } void drawarm(void) { drawupperarm(); drawlowerarm(); } Överarm Underarm void drawupperarm(void) { } void drawlowerarm(void) { }

Från hierarki till kod void drawskeleton(void) { glpushmatrix(); positionera armens origo; drawarm(); glpopmatrix(); } void drawarm(void) { glpushmatrix(); positionera överarmens origo; drawupperarm(); glpopmatrix(); } glpushmatrix(); positionera underarmens origo; drawlowerarm(); glpopmatrix();

Från hierarki till kod Ändra rotation här! void drawskeleton(void) { glpushmatrix (); positionera armens origo; drawarm (); glpopmatrix (); }

Från hierarki till kod glmatrixmode(gl_modelview); glloadidentity(); glpushmatrix(); gltranslatef(modellens position); rita torso; glpushmatrix(); gltranslatef(pivotpunkt för överarmen); glrotatef(grader, rotationsaxel); rita överarmen; glpushmatrix(); gltranslatef(pivotpunkt för underarmen); glrotatef(grader, rotationsaxel); rita underarmen; glpopmatrix(); glpopmatrix(); glpopmatrix();

Animation Uppdateringsmekanism Parametrar Rendering/ utritning Transformationer baserade på parametrarna OpenGL

Demo - forward kinematics param = f (t) param 1 = f 1 (t)... Kända

Ljussättning Phongs ljusmodell Ambient (Allmänljus) N + Diffuse (Matt reflektion) N + Specular (Highlights) R N

Demo http://www.xmission.com/~nate/opengl.html

Goraud shading Färg beräknas i varje hörn och interpoleras sedan linjärt över polygonen. Normaler anges före varje hörn med glnormalf(nx, ny, nz).

Bra att komma ihåg om ljussättning Då ljussättning är aktivt har aktuell färg (glcolor) ingen effekt. Då ljuskällans llans position anges multipliceras den med aktuell modelviewmatris.

GLfloat lpos[4] = {, 2,, 1 }; glmatrixmode(gl_modelview); glloadidentity(); gllightfv(gl_light, GL_POSITION, lpos); gltranslatef(,, -3); glutdrawsolidsphere(...); [ 2 1] T y T y kamera z T x T z kamera x kamera

GLfloat lpos[4] = {, 2,, 1 }; glmatrixmode(gl_modelview); glloadidentity(); gltranslatef(,, -3); gllightfv(gl_light, GL_POSITION, lpos); glutdrawsolidsphere(...); [ 2-3 1] T y T y kamera z T x T z kamera x kamera Ljuskällans position är nu relativt sfären ist.f. världsorigo!

GLfloat lpos[4] = {, 2,, }; glmatrixmode(gl_modelview); glloadidentity(); gllightfv(gl_light, GL_POSITION, lpos); gltranslatef(,, -3); glutdrawsolidsphere(...); Om w-koordinaten är betyder det att ljuskällan är oändligt långt bort i den angedda riktningen. y T Men se till att modelviewmatrisen är identitetsmatrisen, annars blir det ofta oväntade resultat! y kamera z kamera x kamera z T x T

Normaler Normalen i en punkt på en yta definieras av det plan som är parallelt med ytan i punkten: n p = [a b c d] n Om punkten P med koordinaterna p a = [x yz1] T ligger på detta plan gäller att pa =

Normaler Antag nu att vi har en transformationsmatris C. Punktens koordinater transformeras enligt a' = Ca Vi har att pa = pc -1 Ca = Så Ca ligger på planet pc -1, dvs. pc -1 är det transformerade planet.

Normaler Eftersom vi vill postmultiplicera alla vektorer vänder vi på uttrycket: pc -1 = (C -1 ) T p T Så normaler multipliceras med den matris man får om man först inverterar modelview-matrisen och sedan transponerar den! I OpenGL "vet" man att normalen alltid har w =, så av effektivitetsskäl specificerar man alltid normaler med tre komponenter.

Back face culling glenable(gl_cull_face);

Back face culling 9 o > 9 o Kamera

Fram- eller baksida? Definieras av hörnens h ordning sett från n kameran. Konventionen är r att motsols är r riktat mot kameran.

Rastrering "Översätter" från hörn till pixelpunkter. Ett fragment består av Position: (x, y, z) i normerade enhetskoordinater Färg: (R, G, B, A) Texturkoordinater: (s, t, q, r)

Texturer

Texturer OpenGL har ingen filformatstolk för bilder. För labben finns libjpeg förberett. Eller hämta ett gratisbibliotek från webben. Ett bra alternativ är Corona (http://corona.sourceforge.net corona.sourceforge.net/). (Eller skriv en egen tolk...)

Texturkoordinater Texturkoordinat 1 t 1 s gltexcoord2f(s, t); Anges före glvertex (precis som för normaler).

Demo http://www.xmission.com/~nate/opengl.html

MIP-mapping Teknik för att undvika aliasing-problem.

MIP-mapping Filtrera ett antal texturer i förväg och lagra dem effektivt. Vid texturering väljs automatiskt den textur som passar bäst m.a.p. avstånd från kameran (om MIP-mapping är aktiverat). Många grafikkort har andra former av antialiasing också.

Texturering i OpenGL Filtreringsalternativ. Clamp/wrap-around around för texturkoord. Bilddata (texels). Texturobjekt Ett texturobjekt åt gången är aktivt. Texturapplicerings- parametrar Rastrering Texturkoordinater

Förstoring och förminskning Texelstorlek = pixelstorlek (inträffar i princip aldrig) Textur Förstoring Pixelpunkter på skärmen Förminskning Textur Pixelpunkter på skärmen

Filtreringsalternativ Textur Pixelpunkter på skärmen Textur Pixelpunkter på skärmen gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_NEAREST); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); Labbtips: GL_NEAREST_MIPMAP_LINEAR är default, men vi använder nder inte MIP-maps maps... Glöm m heller inte att sätta s parametern för f r förstoring! f

Clamp / wrap around (s, t) = (1.25, -2.75) 1 t GL_REPEAT GL_CLAMP 1 s gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_REPEAT);

Bilddata: Texels m origo n (width, height) = (2 n, 2 m ) där m, n är heltal

Bilddata: : Format och datatyper Format R G B R G B... R G B A R G B A... R R R R...... Datatyp GL_UNSIGNED_BYTE GL_FLOAT...

Specifikation av bilddata glteximage2d(gl_texture_2d, level, internalformat, width, height,, format, type, texels); MIP-map-nivå (sätt till ) Sätt till samma som type GL_RGB eller GL_RGBA Datatyp Namn på array med texels Använder du loadjpeg()-funktionen i skalprogrammet för labben, sätt format till GL_RGB och type till GL_UNSIGNED_CHAR.

Texturappliceringsparametrar gltexenvi(gl_texture_env, GL_TEXTURE_ENV_MODE, mode); där mode är GL_DECAL = Ersätt RGB med texturdata, spara A. GL_REPLACE = Ersätt RGBA med texturdata. GL_MODULATE = Kombinera texturdata med ljussättning/f ttning/färg. Lagras inte i texturobjekt!

Operationer på fragment Huvudsakligen ett antal tester som avgör om fragmentet ska skickas till bildbufferten eller inte. Testerna genomförs alltid i samma ordning. Ordningen är definierad i OpenGL- specifikationen. Används nds för borttagning av skymda ytor, dynamiska skuggor, specialeffekter, m.m.

Djuptest Djupbuffert Bildbuffert Fönster Fragment Vanlig bugg på labben: : du glömde tala om för GLUT att du ville ha en djupbuffert!

Djuptest (Z-buffring) 1.2.9.95 1.1.97.8 1.23 >.97 <.8 < 1.23 1.2.9.95 1.1.97.8 1.23 Testa om anländande ndande fragment har större eller mindre djupvärde än det som redan finns i bufferten. Om värdet är mindre, ersätt med det nya fragmentet.

Mer info GLUT/OpenGL-kompendiet i kursbunten. Woo, Neider,, Davis: The OpenGL Programming Guide,, Addison Wesley Developer Press. Upplagan för f OpenGL 1.1 finns som PDF. Segal, Akeley: The OpenGL Graphics System: A Specification. Finns påp http://www.opengl.org Plus en mängd m andra böcker... b Se länkar l påp kurshemsidan!

Mer info Gå till http://www.opengl.org www.opengl.org/

Nästa gång......skriver vi ett komplett OpenGL-program från scratch!