1 Hva er grafisk databehandling?

Like dokumenter
Programmering grunnkurs TDAT1001: Grafikkdel. Introduksjon

1 Hva er grafisk databehandling?

Leksjon G2: Transformasjoner

Leksjon 2: Transformasjoner

Leksjon G2: Transformasjoner

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

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

Leksjon 3: Lys og materialer

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

Grafiske brukergrensesnitt med Swing og AWT

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

Del 1 En oversikt over C-programmering

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

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

Kodetime for Nordstrand barneskole

INF1000 : Forelesning 1 (del 2)

AlgDat 10. Forelesning 2. Gunnar Misund

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

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

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

UNIVERSITETET I OSLO

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

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

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

Forelesning inf Java 1

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

1. NetBeans IDE: Lage en enkel mobilapplikasjon

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

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

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

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

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

Kapittel 8: Programutvikling

Visuell Programmering: Kom i gang med Processing

Kanter, kanter, mange mangekanter

Programmeringsspråket C

GUI («Graphical User Interface»)

Dagens tema Kapittel 8: Objekter og klasser

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

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

INF Notater. Veronika Heimsbakk 10. juni 2012

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

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

UNIVERSITETET I OSLO

Bilder for Tekstur Mapping. Grunnleggende Grafikk Våren 2007

Argumenter fra kommandolinjen

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

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

AVDELING FOR INGENIØRUTDANNING EKSAMENSOPPGAVE

Operativsystemer og grensesnitt

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.

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

Eksamen. Objektorientert Programmering IGR 1372

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.

Kapittel 1 En oversikt over C-språket

Programmeringsspråket C

UNIVERSITETET I OSLO

Hvorfor objektorientert programmering?

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

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

Klask-en-Muldvarp. Introduksjon. Skrevet av: Basert på MITs "MoleMash for App Inventor 2"-guide (

Introduksjon til objektorientert programmering

Bildebehandling med Python og EzGraphics

Introduksjon til Eclipse

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

Programmeringsspråket C

INF1000: Forelesning 7

INF1010 Grafisk brukergrensesni3 med Swing og awt del 1 INF1010

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

GUI («Graphical User Interface») del 2

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

Side 1 av 12

UNIVERSITETET I OSLO

Kapittel 1: Datamaskiner og programmeringsspråk

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1000: Forelesning 7. Konstruktører Static

Komme igang med App Inventor Introduksjon App Inventor PDF

2 Om statiske variable/konstanter og statiske metoder.

INF våren 2017

2 Om statiske variable/konstanter og statiske metoder.

Læringsmål og pensum. v=nkiu9yen5nc

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

Forelesning inf Java 1

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Forelesning inf Java 1

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.2016 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 18 1.1.1. Noen nyttige linker: Lenkene under viser til svært mye lærestoff, programeksempler og demoer. Det på ingen måte meningen at du skal sette det inn i alt dette i forbindelse med denne leksjonen. Hovedhensikten med å vise til disse lenkene, er at du kan begynne å gjøre deg kjent med dem slik at du kan bruke dem som støtte til leksjonene 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. Kodeeksemplene i leksjonen er skrevet i JOGL-versjon 1.1.1 versjon Det er imidlertid ikke store endringer som må gjøres i koden for å bruke Versjon 2. De viktigste endringene framkommer i de to eksempelprogrammene som finnes sist i denne leksjonen. Se også fagets hjemmeside. 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 Versjon 1 JOGL nedlasting versjon 1, se fagets hjemmeside for nedlasting av Windows-API og dokumentasjon Installasjonsveiledning for JOGL på hjemmepc JOGL API, versjon 1.1.1 dokumentasjon, demoer http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.1a/ JOGL versjon2 http://jogamp.org/ og https://www3.ntu.edu.sg/home/ehchua/programming/opengl/jogl2.0.html 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++ http://www.opengl.org/ http://www.sgi.com/ http://www.glprogramming.com/red/ http://www.glprogramming.com/red/appendixi.html http://nehe.gamedev.net/ Nate Robins tutorials. Demonstrerer grunnleggende http://users.polytech.unice.fr/~buffa/cours/synthese_image/docs/www.xmission.com/nate/tutors.html OpenGL-begreper ved å la brukeren interaktivt endre på metodeparametre for transformasjoner, lys, tåke og tekstur 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.

Hva er grafisk databehandling? side 3 av 18 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. 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 18 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 18 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 18 Det finnes flere eksempler i Red Book på http://www.glprogramming.com/red/appendixi.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 18 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 18 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 18 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 18 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 18 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 18 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 fagets hjemmeside. Det finnes en enkel installasjonsveiledning se lenken Dokumentasjonen ligger på fagets hjemmeside, men 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 to eksempler på uttegning av en trekant på dataskjermen vha OpenGL med Javabinding/OpenGL med Java-rammeverk, JOGL versjon 1 og JOGL versjon 2. JOGL Versjon 1 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);

Hva er grafisk databehandling? side 13 av 18 setdefaultcloseoperation(exit_on_close); TegningOv1_1JOGL tegningen = new TegningOv1_1JOGL(400, 400); 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 JOGL-versjon 1.1.1a Draws one triangle 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

Hva er grafisk databehandling? side 14 av 18 canvas = new GLCanvas(capabilities); // Instantiate the GLCanvas object, canvas, with the wanted properties canvas.addgleventlistener(this); // Knytter intefaces GLEventListner mot canvas objektet. this.add(canvas); // Knytter canvas-objektet til objektet av klassen TegningOv1_1JOGL this.setsize(width,hight); // Setter størrelsen på TegningOv1-1JOGL (JPanel) canvas.setsize(width,hight); ///We want the JPanel and the GLCanvas to have the same size canvas.setvisible(true); //This is somehow necessary public void init(glautodrawable gldrawable) { 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

Hva er grafisk databehandling? side 15 av 18 JOGL versjon 2 Jogl 2 programvare og dokumentasjon kan lastes ned fra sidene: http://jogamp.org/ og https://www3.ntu.edu.sg/home/ehchua/programming/opengl/jogl2.0.html Et kode-eksempel på program skrevet i JOGL-versjon 2 er gitt under: Se også fagets hjemmeside. /* TegningOv1_1JOGL_Canvas.java JHN 2015-08-10 Tomas Holt 2015-08-15 Draws one triangle JOGL versjon 2 */ import javax.swing.*; // klassene JFrame og JPanel //NYE IMPORTS AV TOMAS import static com.jogamp.opengl.gl2.*;//slipper à bruke GL2.konstant import com.jogamp.opengl.gl2; import com.jogamp.opengl.glu.glu; import com.jogamp.opengl.gleventlistener; import com.jogamp.opengl.glautodrawable; import com.jogamp.opengl.glcapabilities; import com.jogamp.opengl.awt.glcanvas; import static com.jogamp.opengl.fixedfunc.glmatrixfunc.gl_modelview; import static com.jogamp.opengl.fixedfunc.glmatrixfunc.gl_projection; import com.jogamp.opengl.util.fpsanimator; import java.awt.dimension; public class TegningOv1_1JOGL_Canvas extends GLCanvas implements GLEventListener{ /* interfacet GLEventListener innholder de 5 metodene som mã implemeenteres: - display(gldrawable drawable) Called by the drawable to initiate OpenGL rendering by the client - displaychanged(gldrawable drawable, boolean modechanged, boolean devicechanged) Called by the drawable when the display mode or the display device associated with the GLDrawable has changed. - init(gldrawable drawable) Called by the drawable immediately after the OpenGL context is initialized. - reshape(gldrawable drawable, int x, int y, int width, int height) Called by the drawable during the first repaint after the component has been resized.

Hva er grafisk databehandling? side 16 av 18 */ -dispose(glautodrawable d) private float angle; private GLU glu = new GLU(); private float number = 1.0f; //konstruktor public TegningOv1_1JOGL_Canvas(GLCapabilities c){ super(c); this.addgleventlistener(this); public void init(glautodrawable gldrawable) { System.out.println("init()"); GL2 gl = gldrawable.getgl().getgl2(); //GL gl = gldrawable.getgl(); TOMAS //Get the GL object from gldrawable gl.glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); // Sets the background color to white gl.glmatrixmode(gl_projection); // Select The Projection Matrix gl.glloadidentity(); // Reset the view matrix to the identity matrix glu.gluperspective(45.0,1.25,2.0,9.0);// Spesifize the projection matrix (fov, w/h, near plane, far plane) //gl.glfrustum(- 3, 3, -3, 3, 1, 9); // Definerer en matrise for perspektivtransformasjon //gl.glortho(- 3, 3, -3, 3, -10, 10); // Ortogonalprojeksjon //glu.glulookat(0, 0, 4, 0, 0, 0, 0, 1, 0); gl.glmatrixmode(gl_modelview); gl.glloadidentity(); public void reshape(glautodrawable gldrawable, int i, int i1, int width, int height) { public void dispose(glautodrawable d){;//lag til TOMAS /* Draw one triangle */ public void drawglscene(glautodrawable gldrawable) { GL2 gl = gldrawable.getgl().getgl2();//gl gl = gldrawable.getgl(); TOMAS gl.glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); //Clear The Screen And The Depth Buffer gl.glloadidentity(); // Reset The View matrix gl.gltranslatef(-1.5f,0.0f,-8.0f); // Move Left 1.5 Units and into The Screen 7 units gl.glcolor3f(1.0f,0.0f,0.0f); // Set the Color to Red gl.glbegin(gl_triangles); // Start drawing using the polygon primitiv GL.GL_TRIANGLES gl.glvertex3f( 0.0f, 1.0f, 0.0f); // Top

Hva er grafisk databehandling? side 17 av 18 gl.glvertex3f(-1.0f,-1.0f, 0.0f); gl.glvertex3f( 1.0f,-1.0f, 0.0f); gl.glend(); // Bottom Left // Bottom Right // Finished Drawing The Triangle /** void display() Draw to the canvas. */ /* Purely a Java thing. Simple calls drawglscene once GL is initialized */ public void display(glautodrawable gldrawable) { System.out.println("display()"); GL2 gl = gldrawable.getgl().getgl2(); drawglscene(gldrawable); // Calls drawglscene public void displaychanged(glautodrawable gldrawable, boolean b, boolean b1) { // Must be present due to the GLEventListener interface public static void main(string args[]){ GLCanvas canvas = new TegningOv1_1JOGL_Canvas(null);//null => setter ingen egenskaper for context canvas.setpreferredsize(new Dimension(800,600)); final JFrame frame = new JFrame(); // Swing's JFrame or AWT's Frame frame.setdefaultcloseoperation(jframe.exit_on_close);//lukk appen med kryss frame.getcontentpane().add(canvas); frame.settitle("eksempel 1 - JOGL 2"); frame.pack(); frame.setvisible(true); /* For animasjon - trengs ikke her final FPSAnimator animator = new FPSAnimator(canvas, FPS, true); animator.start(); // start the animation loop */ // TegningOv1_1

Hva er grafisk databehandling? side 18 av 18 Innhold 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