1 Hva er grafisk databehandling?



Like dokumenter
Programmering grunnkurs TDAT1001: Grafikkdel. Introduksjon

Leksjon G2: Transformasjoner

1 Hva er grafisk databehandling?

Leksjon 2: Transformasjoner

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Leksjon 2: Transformasjoner

Leksjon G2: Transformasjoner

Grafiske brukergrensesnitt med Swing og AWT

1. NetBeans IDE: Lage en enkel mobilapplikasjon

Kanter, kanter, mange mangekanter

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

INF1000 : Forelesning 1 (del 2)

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

AlgDat 10. Forelesning 2. Gunnar Misund

Leksjon 3: Lys og materialer

Del 1 En oversikt over C-programmering

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Kodetime for Nordstrand barneskole

Mål med kurset. Java i INF Dagens tema. GUI med Swing. Dokumentasjon

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

2 Om statiske variable/konstanter og statiske metoder.

Eksamen. Objektorientert Programmering IGR 1372

Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

UNIVERSITETET I OSLO

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Forelesning inf Java 1

Stjerner og galakser Nybegynner Python PDF

Moving Objects. We need to move our objects in 3D space.

Programmeringsspråket C

Visuell Programmering: Kom i gang med Processing

Forelesning inf Java 1

INF Våren Li' repe$sjon om Tråder og GUI. Stein Gjessing, Ins$tu' for informa$kk, Universitetet i Oslo. Ins$tu' for informa$kk

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Tåke (Fog) Grunnleggende Grafikk Våren Tåke. pname og param. OpenGL innebygde tåke støtte som. Må enable tåke. Sett tåke tilstander

Kapittel 8: Programutvikling

Dagens tema Kapittel 8: Objekter og klasser

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Operativsystemer og grensesnitt

Argumenter fra kommandolinjen

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

INF1000 undervisningen INF 1000 høsten 2011 Uke september

GUI («Graphical User Interface»)

Sprettende ball Introduksjon Processing PDF

Programmeringsspråket C

Programmeringsspråket C

Side 1 av 12

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Skilpaddekunst. Steg 1: Møt skilpadden. Sjekkliste. Introduksjon. Turtles

MAT-INF 1100: Obligatorisk oppgave 1

Introduksjon til objektorientert programmering

Læringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop

HØGSKOLEN I SØR-TRØNDELAG

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

Plan for dagen. Vprg 4. Dagens tema - filbehandling! Strømmer. Klassen FilLeser.java. Tekstfiler

Bildebehandling med Python og EzGraphics

Komme igang med App Inventor Introduksjon App Inventor PDF

Leksjon 2. Setninger og uttrykk

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Bilder for Tekstur Mapping. Grunnleggende Grafikk Våren 2007

INF1000 Metoder. Marit Nybakken 16. februar 2004

1 t:n'v'\ekode LO325E. Alle ~vne og trykte. GOd'"j(jent kalkulator

TDT4100 Objektorientert programmering

HØGSKOLEN I SØR-TRØNDELAG

INF våren 2017

INF Notater. Veronika Heimsbakk 10. juni 2012

Rull-en-ball Introduksjon Unity PDF

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

MAT-INF 1100: Obligatorisk oppgave 1

Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

INF1000: Forelesning 7

UNIVERSITETET I OSLO

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

EKSAMENSOPPGAVE. : INF-1400 Objektorientert programmering. Oppgavesettet er på 5 sider inklusiv forside

Repitisjonskurs. Arv, Subklasser og Grensesnitt

INF Obligatorisk oppgave 2

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Transkript:

Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag 1 Hva er grafisk databehandling? Jan H. Nilsen 14.08.2014 Lærestoffet er utviklet for faget LV381D 3D-Programmering med OpenGL og Java Resymé: Denne leksjonen skal gi en kort introduksjon til grafisk databehandling og til OpenGL med Java-binding. OpenGL er et programvareinterface mot grafisk hardware, for eksempel dataskjermer via skjermkontroller. OpenGL er såkalt plattformuavhengig og kan kalles fra flere programmeringsspråk. Den mest brukte språkbindingen i Java heter JOGL..Du vil bli presentert for en del grunnleggende begreper, bildeeksempler og et enkelt programeksempel som bruker OpenGL med Javabinding til å tegne ut enkle figurer på dataskjermen din. (Lærestoffet i denne leksjonen er i hovedsak hentet fra Kap. 1 i Open GL, A primer, Angel. E., 2007 og kap. 1 i OpenGL Programming guide (Red Book) Shreiner, D. et al., 2007.) 1.1. Introduksjon Lærestoffet i denne og de resterende leksjonene vil bli forsøkt gjort mest mulig anveldelsesorientert, dvs at det i stor grad vil bli benyttet programeksempler i tilnærmingen til lærestoffet. Dette mener vi vil kunne gjøre stoffet lettere tilgjengelig og samtidig virke motiverende i innlæringsprosessen. Det er derfor viktig å komme tidlig i gang med programmeringen. Målsettingen er at du etter å ha arbeidet deg gjennom denne leksjonen skal være i stand til å skrive et lite program i OpenGL med java-språkbinding (JOGL), som tegner ut en figur på dataskjermen din. JOGL kan lastes ned gratis (se installasjonsveiledning lenger ned). Først i denne leksjonen er det gitt en kortfattet introduksjon til grafisk databehandling med noen bildeeksempler laget vha. programvaresystemet OpenGL. Så følger en introduksjon til OpenGL med Java-språkbinding (JOGL). Det er i leksjonene gitt et eksempel på et javarammeverk for utvikling av OpenGL-programmer med javabinding. Programkoden til rammeverket er lagt ved som et vedlegg til leksjonen og kan lastes ned direkte. En veiledning for nedlasting og innstallering av JOGL lokalt på din maskning finner du som et vedlegg til denne leksjonen. Basisstrukturen til et OpenGL-program er søkt forklart ved hjelp av et programeksempel. Gjennom programeksemplelet blir det også gitt en kortfattet forklaring på hva som menes med OpenGL-primitiver, -metode- og -kommandosyntaks og - datatyper. Det vil også bli henvist til programbiblioteker relatert til OpenGL, henholdsvis GLU (OpenGL Utility Library) og GLUT (OpenGL Utility Toolkit). Til de fleste av leksjonene er det knyttet en øving. Som del av øvingen til denne leksjonen, skal du laste ned og installere JOGL. Du skal videre i øvingen lage ditt eget OpenGL-program som tegner ut en trekant og en firkant på skjermen. Se vedlagt øvingsoppgave. Bortsett fra leksjonene vil det meste av læremateriellet som følger med dette kurset være på engelsk. Dersom du ikke er vant til å lese engelsk, kan nok dette i starten virke noe strevsomt. Du må nok bare venne deg til engelsken raskest mulig, fordi som nevnt mesteparten av faglitteraturen forekommer på dette språket. 3D-Programmering med OpenGL og Java er et fag det ikke er mulig bare å lese seg til. Praksis er helt nødvendig for å lære faget. Det legges derfor stor vekt på praktisk øvinger i dette kurset. Opphavsrett: Forfatter og Stiftelsen TI

Hva er grafisk databehandling? side 2 av 15 1.1.1. Noen nyttige linker: Lenkene under viser til svært mye lærestoff, programeksempler og demoer. Det på ingen måte menignen at du skal sette det inn i alt dette i forbindelse med denne leksjonen. Hovedhensikten med å vise til disse lenkene, er at du kan bebynne å gjøre deg kjent med dem slik at du kan bruke dem som støtte til leksjoene videre utover i kurset. En del av lenkene viser til programeksempler skrevet i c-kode, for eksempel Red Book, men det vil i kurset bli forsøke å vise hvordan denne koden kan benyttes også i Java-programmer. Før man begynner med JOGL programmering så må Java (Java SE) være installert på maskinen. OBS! Vi skal i dette kurset ikke bruke siste versjon av JOGL (versjon 2), men vi bruker i stedet versjon 1.1.1a. Grunnen til dette er at det er endringer i versjon 2 som gjør at man ikke kan bruke veiledningene man f.eks. finner på NeHe (se lenke under) osv. om man bruker siste versjon. Hvilken versjon man bruker betyr ingenting for forståelsen, men det er veldig greit å kunne finne eksempelkode når man skal lære OpenGl. Det er derfor bedre å gå over på ny versjon når man har lært det grunnleggende. For nedlasting og installasjon se lenken under. JOGL nedlasting og installasjon JOGL API, dokumentasjon, demoer OpenGL s hjemmeside Silicon Graphics hjemmeside OpenGL Programming Guide, The Red Book: Programeksempler i C Appendix J Color Plates: NeHe tutrials OpenGL Java, C, C++ Installasjonsveiledning for JOGL på hjemmepc http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/ http://www.opengl.org/ http://www.sgi.com/ http://fly.srk.fer.hr/~unreal/theredbook/ http://fly.srk.fer.hr/~unreal/theredbook/appendixj.html http://nehe.gamedev.net/ Nate Robins tutorials. Demonstrerer grunnleggende OpenGL-begreper ved å la brukeren interaktivt endre på metodeparametre for transformasjoner, lys, tåke og tekstur Kontakt Tapir bokhandel Trondheim for bestilling av lærebok: http://www.xmission.com/~nate/tutors.html kalvskinnet@tapir.no 1.2. Hva er grafisk databehandling? I følge Angel, 2007, Interactive Computer Graphics, omfatter grafisk databehandling alle aspekter ved det å produsere tegninger eller bilder ved hjelp av en datamaskin. Alt fra det å tegne punkter og linjer på en dataskjerm eller et digitalt framvisningsmedium, til å generere virtuelle, fotorealistiske modellbilder, kan derfor kalles grafisk databehandling. Kvaliteten på slike datamaskingenererte bilder er nå så gode at de ofte vanskelig kan skilles fra fotografier tatt med vanlige kameraer. Det er vanlig å angi fire hovedanvendelsesområder for grafisk databehandling, henholdsvis til vising av informasjon på skjerm, til design av alt fra muttere til biler hus og store industrianlegg, til simulering, visualisering og animasjon og til grafiske brukergrensesnitt. På grunn av at pris, brukervennlighet og ytelse på både grafisk programvare og maskinvare stadig blir mer tilgjengelig, så har bruken av datagrafikk økt svært mye de siste årene. Fig. 1.2.1 Ekempel I grafisk databehandling blir de objektene som skal tegnes ut, først beskrevet ved matematiske modeller. En terning/kube kan for eksempel modelleres i et tredimensjonalt koordinatsystem ved å definere origo og akser i koordinatsystemet og angi koordinatene til hjørnepunktene på terningen i dette koordinatsystemet.

Hva er grafisk databehandling? side 3 av 15 Fig. 1.2.2 Kube i et 3D-aksekors (Børre Stenseth 2006) Veien fra den matematiske beskrivelsen av objektene (definering av koordinatsystem og 3d-koordinater for hjørnepunkter) til uttegning på en skjerm, medfører en rekke operasjoner. Ulike grafiske programsystemer vil som oftest ha ulike måter å gjøre dette på. I dette faget skal vi benytte det grafiske programsystemet OpenGL. Noen bildeeksempler fra Red Book: Figur 1.2.3 Objekter rendret som trådmodeller. (Fra Red Book Nettversjon)

Hva er grafisk databehandling? side 4 av 15 Figur 1.2.4 Samme scene. Tåke brukt til å simulere dybde. (Fra Red Book Nettversjon) Figur 1.2.5 Samme scene. Glatting av linjer med antialiased linjer. (Fra Red Book Nettversjon)

Hva er grafisk databehandling? side 5 av 15 Figur 1.2.6 Samme scene. Flat skyggelegging av polygoner. (Fra Red Book Nettversjon) Figur 1.2.7 Samme scene. Rendret med lys og jevnt-skyggelagte polygoner. (Fra Red Book Nettversjon)

Hva er grafisk databehandling? side 6 av 15 Det finnes flere eksempler i Red Book på http://fly.srk.fer.hr/~unreal/theredbook/appendixj.html 1.3. Hva er OpenGL? OpenGL er et interaktivt datagrafikksystem (programvaregrensesnitt) som gjør det mulig for en programmerer å skive programmer som aksesserer grafisk maskinvare. OpenGL: er etablert som en slags industristandard og referansestandard for generell 3D-grafikk blir utviklet av Silicon Graphics. utvikles nå under kontroll av et: Architectural Review Board. Beskrivelse av denne virksomheten finnes på: ARB. Her finnes også linker til beskrivelser, kurs og eksempler. Det finnes en masse informasjon om OpenGL på nettet. OpenGL er utviklet og beskrevet som en plattformuavhengig pakke og kan kjøres på en rekke plattformer: MS-Windows NT/2000/95, Linux, Unix, MacOS, OS/2. Vi kan benytte OpenGL fra flere programmeringsspråk. Det finnes i dag komplette språkbindinger for i hvert fall C, C++, Fortran og Java. OpenGL er et programvaregrensesnitt- mot grafisk hardware(skjerm, printer osv). OpenGL består av ca 250 metoder/kommandoer som kan benyttes til å spesifisere objekter og operasjoner som er nødvendige for å produsere interaktive, 3D grafiske anvendelser OpenGL innholder opprinnelig ingen kommandoer/metoder for å utføre vindus/skjermoperasjoner eller for å motta brukerinput OpenGL tilbyr ingen høy-nivå-kommandoer/metoder for å beskrive modeller av 3D-objekter OpenGL tilbyr kommandoer/metoder for å bygge egne modeller av objekter på grunnlag av et lite sett med geometriske primitiver: (hjørne)punkter, linjer og polygoner. OpenGL gjør oss i stand til å: Konstruere former/objekter på grunnlag av geometriske primitiver og dermed skape matematiske beskrivelser av objektene. (OpenGL betrakter punkter, linjer, polygoner, digitale bilder og bitmaps som primitiver) Ordne polygonene i 3D-rom og velge ønsket betraktningspunkt for å se på den sammensatte scenen. Beregne fargen på objektene. Fargene kan være eksplisitt gitt av anvendelsen eller bestemt av betraktningsbetingelser, eller ved å legge på tekstur/digitale bilder/mønster på objektene og som kombinasjoner av disse tre beregningsmåtene. Omforme de matematiske beskrivelsene av objektene og deres tilhørende farger til pixler på skjermen. OpenGL kan også utføre en rekke andre operasjoner som for eksempel eliminere skjulte flater. Basisstrukturen i et OpenGL-program kan være enkel: Hovedoppgavene er: Initiere visse tilstander som kontrollerer hvordan OpenGL rendrer (render/tegner ut) objekter eller hele scener Spesifisere objektene som skal rendres /tegnes ut vha modeller. Modellene av objektene er basert på matematiske beskrivelser av objektene, for eksempel alle koordinatverdier til hjørnepunktene til objektene. Objektmodellene blir så bygget opp/tegnet ut ved hjelp av et lite sett med OpenGL-geometriske primitiver; punkter, linjer og polygoner, som blir spesifisert ved hjelp av objektenes hjørnepunkter. Det endelige produktet etter en renderingsprosess er et 2D-bilde av objektet på dataskjermen. Bildet framkommer ved å fargelegge dataskjermens bildeelementer/pixler på en slik måte at objektene kan gjenkjennes.

Hva er grafisk databehandling? side 7 av 15 OpenGL-primitiver OpenGL benytter seg av et meget begrenset sett med geometriske primitiver for å sette sammen objekter. I figur 1.2.4 er alle disse geometriske primitivene angitt. Figur 1.2.4 OpenGL geometriske primitiver (RedBook nettversjon) Alle objekter som tegnes ut i OpenGL genereres følgelig enten vha de geometriske primitivene punkter, linjer mellom punkter eller flateelementer som trekanter eller konvekse mangekanter. En ikke konvekse mangekant må inndeles i enten to mindre konvekse mangekanter eller trekanter. Se RedBook, 2006 side 39 om gyldige polygoner. Figur 1.3.1 Gyldige polygoner (konvekse) Ikke gyldige (konkave eller med hull) (Red Book Nettversjon) 1.3.1 Hva er OpenGL med Javabinding JOGL? JOGL er open kildekode teknologi. Det var Game Technology-gruppen ved Sun som startet arbeidet med JOGL i 2003. JOGL tilbyr full tilgang til OpenGL API-er og kan kombineres med Java AWT og Swing komponenter. Mesteparten av egenskapene i OpenGL GLU (OpenGL Utility library) og GLUT (OpenGL Utility Toolkit), kan nås via JOGL. JOGL-versjonen av GLUT inneholder ikke window-funksjonalitet. Dette blir tatt hand om av Java. JOGL er i ferd med å bli utviklet til å bli referanse implementasjon for JSR.231spesifikasjonen for binding av OpenGL til Java. Dette arbeidet pågår fortsatt, men det sies at det er relativt nært forestående at en første offisiell versjon vil foreligge. Siste stabile release candidate, rc, når dette blir skrevet, var rc8 fra 22. februar 2008.

Hva er grafisk databehandling? side 8 av 15 1.3.2 Kommandosyntaks for kjøring av OpenGL-programmer i Java Navnet på OpenGL-metoder som kalles fra Java begynner med GL. + OpenGLMetodenavn(); Sammensatte metodenavn i OpenGL skrives med stor forbokstav for hvert av de sammensatte ordene. Eks: glclearcolor() Konstanter skrives med store bokstaver og understrekningstegn mellom sammensatte ord; for eks: GL.GL_CLEAR_BUFFER_BIT. Følgende eksempel viser en del av en JOGL-metode som tegner ut en polygon. Hjørnepunktene er gitt slik i modellkoordinatsystemet at de ligger i xy-planet og danner et kvadrat med sentrum i origo : gl.glcolor3f(1.0f, 1.0f, 1.0f); // Setter fargen på de etterfølgende objektene som skal tegnes til hvit gl.glbegin(gl.gl_polygon); // Start på spesifikasjonen av objektet og hvilken OpenGL primitiv som skal benyttes gl.glvertex2f(-0.5f, -0.5f); // Def. polygonet s hjørnepunkter (2D) (vertex) gl.glvertex2f(-0.5f, 0.5f); gl.glvertex2f(0.5f, 0.5f); gl.glvertex2f(0.5f, -0.5f); gl.glend(); //Angir slutten på spesifikasjon av polygonet Eksempel 1.3.2.1 Eksempel på JOGL-syntaks. Del av JOGL-metode som tegner ut et kvadratisk polygon sentrert i origo og med hjørnepunkter (x,y) lik (-0.5, -0.5), (-0.5, 0.5), (0.5, -0.5) og (0.5, 0.5). Vi ser at for enkelte av metodenavnene så står det 2f eller 3f foran parentesene. Det betyr at antall argumenter er henholdsvis 2 eller 3 og at datatypen på argumentene er float.

Hva er grafisk databehandling? side 9 av 15 1.3.3 Datatyper i JOGL med korresponderende datatyper i c- og Java I tabell 1.3.3.1 er det vist en sammenlikning mellom OpenGL-datatyper og korresponderende datatyper i c- og Java Tabell 1.3.3.1 Datatyper Suffix Data Type Typical Typical OpenGL Type Definition Corresponding C-language Type Corresp. Java Type b 8-bit integer signed char byte GLbyte s 16-bit integer short short GLshort i 32-bit integer long int GLint, GLsizei f 32-bit floating-point float float GLfloat, GLclampf d 64-bit floating-point double double GLdouble, GLclampd ub 8-bit unsigned integer unsigned char GLubyte, GLboolean us 16-bit unsigned integer unsigned short short, char GLushort ui 32-bit unsigned integer unsigned long GLuint, GLenum, GLbitfield I de etterfølgende kapitlene er det forsøkt å gi en kortfattet introduksjon til hva som menes med at OpenGL er en tilstandsmaskin, eksempler på noen tilstandsvariable, OpenGL rendering pipeline, støttebibliotekene GLU og GLUT og et enkelt rammeverk for kjøring av OpenGL-programmer i Java. Dette er omfattende temaer som det her bare gis en kort beskrivelse av men som vil bli tatt opp nærmere i senere leksjoner. Hensikten med å ta de med her er å forsøke å gi en viss forståelse for å lage et enkelt program i OpenGL med Java-binding. 1.3.4 OpenGL en tilstandsmaskin OpenGL settes i en tilstand/modus som forblir slik til den blir endret. Tilstandene kan gjelde for eksempel tilstander som farge og koordinattransformasjoner. Eksempelvis vil OpenGL-metodekallet på vegne av et objektet gl av klassen GL se slik ut: gl.glcolor3f(1.0f, 1.0f, 1.0f);, spesifisere programutførelsen slik at alt etterfølgende blir tegnet med hvit farge. Dette vil skje helt til fargen endres, for eksempel gjennom et nytt kall til samme metode. Mange tilstandsvariable refererer til moduser/tilstander som enten kan slås på eller av. Dette kan gjøres med gl.glenable() og gl.gldisable(). For eksempel vil metodekallet: gl.glenable(gl.gl_depth_test); //Enables Depth Testing slå på en dybdetest som medfører at skjult flater ikke blir tegnet ut. Verdiene på tilstandsvariablene kan finnes ved metodekallene: gl.glgetbooleanv(), gl.glgetdoublev(), gl.glgetfloatv(), gl.glgetinteger(), gl.glgetpointerv(), gl.glisenabled()

Hva er grafisk databehandling? side 10 av 15 1.3.5 Eksempler på noen tilstandsvariable for farge I tabell 1.3.4.1 er det gitt eksempler på noen tilstandsvariabler for farge. Tabell 1.3.4.1 Noen tilstandsvariabler for farge. (RedBook nettversjon): Coloring State Variables State Variable Description Attribute Group Initial Value Get Command GL_FOG_COLOR Fog color fog 0, 0, 0, 0 glgetfloatv() GL_FOG_INDEX Fog index fog 0 glgetfloatv() GL_FOG_DENSITY Exponential fog density fog 1.0 glgetfloatv() GL_FOG_START Linear fog start fog 0.0 glgetfloatv() GL_FOG_END Linear fog end fog 1.0 glgetfloatv() GL_FOG_MODE Fog mode fog GL_EXP glgetintegerv() GL_FOG True if fog enabled fog/enable GL_FALSE glisenabled() GL_SHADE_MODEL GL_PROJECTION_MATRIX glshademodel() setting Projection matrix stack lighting GL_SMOOTH glgetintegerv() -- Identity glgetfloatv() 1.3.6 OpenGL rendering/uttegning pipeline Data som leses inn av et OpenGL-program gjennomgår en rekke prosesser før de tegnes ut som figurer/pixler på en dataskjerm. Vi sier at vi sender dataene gjennom en OpenGL rendering pipeline for å bli tegnet ut på skjermen. Figur 1.3.5.1 viser en prinsippskisse av denne dataflyten og hvilke prosesser den utsettes for. Figur 1.3.5.1 OpenGL rendering pipeline. (RedBook nettversjon) Følgende prosesser utføres på inndataene som kan være enten geometriske data (koordinatverdier) eller pixelverdier: 1. Inndata: Geometriske data eller pixeldata

Hva er grafisk databehandling? side 11 av 15 2. Display lister: mellomlagring av inndata 3. Evaluators: Evaluatorer tilbyr metoder for å utlede/bestemme/beregne hjørnepunkter for å kunne tegne ut en 3D-flate p.g.a. kontrollpunktene. Alle geometriske primitiver kan beskrives av hjørnepunkter (Vertices). Noen flater kan beskrives av kontrollpunkter og matematiske basisfunksjoner. 4. Per-Vertex Operasjoner: Samlingen av hjørnepunkter vil bli konvertert til primitiver, e,.g. linjer, polygoner osv. Romlige koordinater blir transformert og projisert fra en posisjon i 3D verden til en posisjon på skjermen, 2D. 5. Primitive Assembly, P.A.: Klipping er viktig del av primitiv assembly. Punkt-klipping, linje- og polygon-klipping. Perspektiv divisjon: Objekter langt borte ser mindre ut. Resultatet av P.A. er fullstendige geometriske primitiver som er transformert og klippet med rettfarge og dybde og også med texturverdier og retningslinjer for rasterisering. 6. Texture Assembly: OpenGL kan legge textur-bilder på geometriske objekter for å få de til å se mer realistiske ut 7. Rasterisering. Omforming av geometriske- og pixel-inndata til fragmenter. Hver fragmentrute tilsvarer en pixel i bildebufferet. Når hjørnepunkter, knyttes sammen til linjer eller indre pixler beregnes for å fylle polygoner, blir linje og polygonstriper, linjebredde, punktstørrelse, skyggeleggingsmodell og overdekkingsberegninger for å unngå alliasing, vurdert. Farge og dybdeverdier blir tilordnet hver enkelt pixel/fragmentrute. 8. Fragmentoperasjoner(skjermpixler) Før de endelige pixleverdiene blir lagret i bildelageret/framebufferet, blir det utført en rekke operasjoner som kan endre og fjerne fragementer. Alle disse operasjonene kan enables eller disables, dvs slås på eller av. Den første operasjonen som kan bli slått på er tekstur, hvor et teksturelement blir generert fra teksturminnet for hvert fragment og lagt oppe på fragmentet. Så kan eventuelt tåkeberegninger bli utført. Deretter kan følgende tester utføres, scissor/klippetesten(default klipperektangel matcher størrelsen på vinduet på skjermen og klippetesten er slått av). Så kan det utføres en alpha/gjennomsiktighetstest, og dybdebuffer- test for å fjerne skjulte flater. Dersom et fragment ikke består en påslått-test, kan det medføre at den videre prosesseringen av en fragmentrute avsluttes. Til slutt kan blending (det innkommende fragmentets R,G,B og alpha-verdier blir kombinert med de samme R,G,B-verdiene på det pixelet som allerede er lagret på den samme plassen i bildebufferet, dithering (kan øke fargeoppløsningen på bekostning av romlig oppløsning ved at fargeverdien i et pixel, blir beregnet på grunnlag av omliggende pixler), logiske operasjoner (OR, XOR og Invert) og maskering av en bit-maske bli utført. Etter alt dette blir det grundig prosesserte fragmentet lagt på riktig plass i skjermminnet som en pixelverdi. 1.3.7 Biblioteker relatert til OpenGL: OpenGL Utility Library (GLU ) GLU inneholder mange metoder som benytter lavnivå OpenGL metoder til å utføre sammensatte oppgaver. Det kan være b.a. å sette opp matriser for ulike betraktningsorienteringer, til å angi projeksjonsmåte og til klipping/avgrensing av synsvolumet. GLU-metodene begynner med: glumetodenavn(). For eksempel vil glu-metoden, kalt på vegne av et GLU-objekt glu,: glu.gluperspective(gldouble fovy, GLdouble h/ Glfloat w, Gldouble near, GLdouble far); spesifisere en perspektivisk projeksjonsmatrise og klippe ut et synsvolum som blir vist på skjermen. Figur 1.3.6.1 viser betydningen av parameterverdiene i metodehodet. Figur 1.3.7.1 Perspektivisk synsvolum spesifisert med glu.gluperspective(fov, w/h, near, far); (RedBook nettversjon)

Hva er grafisk databehandling? side 12 av 15 1.3.8 Biblioteker relatert til OpenGL: OpenGL Utility Tookit (GLUT ) OpenGL er uavhengig av vindussystemer og operativsystemer. OpenGL inneholder ingen kommandoer for å åpne vinduer eller lese hendelser fra tastatur eller mus. GLUT inneholder funksjonalitet som forenkler åpning av vinduer og registrering av input. Dette benyttes ikke i Java. Her benyttes Javas egen vindows-handtering. OpenGL s tegnekommandoer er begrenset til å generere enkle geometriske primitiver (punkter, linjer og polygoner) GLUT inneholder en god del rutiner som lager mer kompliserte 3d-objekter (teapot, torus(smultringer), kuler osv). GLU inneholder også noen rutiner som kan generere noen av de samme figurene som GLUT (kule, sylinder, skiver). Figur 1.3.7.1 viser eksempel på kompliserte 3D-objekter, en tekanne, som kan tegnes ut direkte med glut-metoden: glut.glutsolidteapot(gldouble size). Det finnes også en tilsvarende metode som tegner ut tekannen som et trådmodell, glut.glutwireteapot(gldouble size). Figur 1.3.7.1 Tekanner tegnet med glut.glutsolidteapot() og innlagt ulike grader av skjelveeffekter, farge- og lyssetting for å simulere fokuserings- og dybdeeffekter. Den gullfargede tekannen er skarpest/ i fokus. (Red Book, nettversion) 1.3.9 Et enkelt rammeverk for kjøring av OpenGL-programmer i Java JOGL API og dokumentasjon kan lastes ned fra siden http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/. Det finnes en enkel installasjonsveiledning se lenken Velg siste stabile beta-versjon. Dokumentasjonen kan også brukes online fra siden: http://download.java.net/media/jogl/builds/archive/jsr-231-beta5/javadoc_public/ I det etterfølgende er det gitt et eksempel på uttegning av en firkant på dataskjermen vha OpenGL med Java-binding/OpenGL med Java-rammeverk. Klassen som inneholder main og lager et vindu på skjermen med tegningen inne i: /* */ import java.awt.*; // Bruker Java-klassene Color og Graphics import javax.swing.*; // Bruker Java-klassene JFrame og JPanel import javax.media.opengl.glcanvas; // JOGL klassen GLCanvas import javax.media.opengl.gl; // JOGL klassen GL import javax.media.opengl.gldrawable; // JOGL klassen GLDrawable import javax.media.opengl.gleventlistener; // JOGL interfacet GLEventListener import javax.media.opengl.glautodrawable; // JOGL klassen GLAutoDrawable import javax.media.opengl.glu.glu; // JOGL klassen GLU class Vindu extends JFrame { public Vindu(String tittel) { settitle(tittel); setdefaultcloseoperation(exit_on_close); TegningOv1_1JOGL tegningen = new TegningOv1_1JOGL(400, 400);

Hva er grafisk databehandling? side 13 av 15 add(tegningen); pack(); /*Klassen som inneholder main*/ class GrafikkEksempelOv1JOGL { public static void main(string[] args) { Vindu etvindu = new Vindu("En trekant og en firkant"); etvindu.setvisible(true); Klassen som generer tegningen TegningOv1_1JOGL: /* TegningOv1_1JOGL.java JHN 2006-06-18 Draws one quad OpenGL with Java-binding, JOGL Reviced 2008-08-17 for newest stabile jogl version ( JSR-231 rc8 Feb. 22 2008 ) */ // Java classes: import java.awt.*; // klassene Color og Graphics import javax.swing.*; // klassene JFrame og JPanel //JOGL classes: import javax.media.opengl.glcanvas; import javax.media.opengl.gl; import javax.media.opengl.gldrawable; import javax.media.opengl.gleventlistener; import javax.media.opengl.glautodrawable; import javax.media.opengl.glu.glu; import javax.media.opengl.glcapabilities; public class TegningOv1_1JOGL extends JPanel implements GLEventListener{ /* the interface GLEventListener innholder følgende fire metoder som må implementeres: -display(glautodrawable drawable) Called by the drawable to initiate OpenGL rendering by the client - displaychanged(glautodrawable drawable, boolean modechanged, boolean devicechanged) Called by drawable when the display mode or the display device associated with GLDrawable has changed. - init (GLAutoDrawable drawable) Called by the drawable immediately after the OpenGL context is initialized. - reshape(glautodrawable drawable, int x, int y, int width, int height) Called by the drawable during the first repaint after the component has been resized. */ private GLCanvas canvas; private GLU glu = new GLU(); public TegningOv1_1JOGL(int width, int hight) { // Konstruktør til tegneklassen super(); // Anroper konstruktøren rett over i klassetreet, dvs i klassen JPanel GLCapabilities capabilities = new GLCapabilities();//Instatiate an object to give properties to the GLCanvas object capabilities.sethardwareaccelerated(true); //We want hardware acceleration capabilities.setdoublebuffered(true); //And double buffering to avoid flickering canvas = new GLCanvas(capabilities); // Instantiate the GLCanvas object, canvas, with the wanted properties canvas.addgleventlistener(this); // Knytter intefaces GLEventListner mot canvas objektet.

Hva er grafisk databehandling? side 14 av 15 this.add(canvas); this.setsize(width,hight); canvas.setsize(width,hight); canvas.setvisible(true); public void init(glautodrawable gldrawable) { // Knytter canvas-objektet til objektet av klassen TegningOv1_1JOGL // Setter størrelsen på TegningOv1-1JOGL (JPanel) ///We want the JPanel and the GLCanvas to have the same size //This is somehow necessary GL gl = gldrawable.getgl(); //Get the GL object from gldrawable gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); // Clear the background color of the window/canvas and set it to white gl.glmatrixmode(gl.gl_projection); // Sets the matrix mode to (GL_PROJECTION ) gl.glloadidentity(); // Reset the matrix to the identity matrix glu.gluperspective(45.0,1.25,2.0,9.0); // Specifies the projection matrix (fov, w/h, near plane, far plane) and // clipping volume See Fig 1.3.7.1 public void reshape(glautodrawable gldrawable, int i, int i1, int i2, int i3) { // Has to be implemented due to the GLEventListener interface. Because we draw a static scene and we have given the //size of the GLCanvas the values width, and hight = 400, 400, we do not need to reshape the GLCanvas. /* Draw a triangle */ public void drawglscene(glautodrawable gldrawable) { GL gl = gldrawable.getgl(); gl.glclear(gl.gl_color_buffer_bit GL.GL_DEPTH_BUFFER_BIT); //Clear Screen And Depth Buffer gl.glmatrixmode(gl.gl_modelview); // Sets the view matrix mode to (GL_MODELVIEW) /*Viewing and modeling transformations in OpenGL are combined into a single modelview matrix*/ gl.glloadidentity(); // Initialize the ModelView matrix glu.glulookat(0.0,0.0,1.0, 0.0,0.0,0.0, 0.0,1.0,0.0); // Specifies View model transformation matrix for camera position gl.gltranslatef(-1.5f,0.0f,-5.0f); // Alter view model transf. matrix, move x=-1.5 units y=0 and z= 0 units gl.glcolor3f(1.0f,0.0f,0.0f); // Set the Color to Red for the next to be drawn gl.glbegin(gl.gl_triangles); gl.glvertex3f( 0.0f, 1.0f, 0.0f); gl.glvertex3f(-1.0f,-1.0f, 0.0f); gl.glvertex3f( 1.0f,-1.0f, 0.0f); gl.glend(); /** void display() Draw to the canvas. */ /* Purely a Java thing. Calls drawglscene() once GL is initialized */ // Start drawing a triangle using the polygon primitive GL.GL_TRIANGLES // Top vertex // Bottom Left vertex // Bottom Right vertex // Finished Drawing The Triangle public void display(glautodrawable gldrawable) { GL gl = gldrawable.getgl(); drawglscene(gldrawable); // Calls drawglscene gldrawable.swapbuffers(); // Ligger ikke i glut slik som i c, her er det viktig for ikke å få flimmer!! gl.glflush(); // Tvinger tidligere buffrede OpenGL kommandoer til å utføres med en gang. public void displaychanged(glautodrawable gldrawable, boolean b, boolean b1) { // Has to be implemented due to the GLEventListener interface // TegningOv1_1 Innhold

Hva er grafisk databehandling? side 15 av 15 1.1. INTRODUKSJON... 1 1.1.1. Noen nyttige linker:... 2 1.2. HVA ER GRAFISK DATABEHANDLING?... 2 1.3. HVA ER OPENGL?... 6 INNHOLD... 15