800 likes | 1.02k Views
Sisältö (1/2). 1. osa Yleistä OpenGL:stä OpenGL:n arkkitehtuuri Perusteet kappaleiden piirtämisestä Muunnokset ja matriisit Näkyvyyden määrittäminen Kappaleiden tehokas piirtäminen: Listat ja taulukot. Sisältö (2/2). 2. osa Valaistus Tekstuurit Käyrät ja parametriset pinnat
E N D
Sisältö(1/2) • 1. osa • Yleistä OpenGL:stä • OpenGL:n arkkitehtuuri • Perusteet kappaleiden piirtämisestä • Muunnokset ja matriisit • Näkyvyyden määrittäminen • Kappaleiden tehokas piirtäminen: Listat ja taulukot
Sisältö (2/2) • 2. osa • Valaistus • Tekstuurit • Käyrät ja parametriset pinnat • Blending • Puskurit ja fragmentit • Sumu • Virheiden käsittely & laajennukset
Yleistä OpenGL:stä (1/2) • OpenGL on standardi, (lähes) alustariippumaton ohjelmointirajapinta grafiikkalaitteistolle • Standardin määrittelee Architectural Review Board (ARB) • Järjestelmäriippuvaisia osia pääasiassa ikkunajärjestelmään liittyviä toiminnot sekä OpenGL:n käyttöönotto(GLX, WGL) • Nykyiset versiot 1.1-1.4 • Versio 2.0 tekeillä
Yleistä OpenGL:stä (2/2) • OpenGL koostuu kahdesta osasta • Itse rajapinta • GLU, joka on rajapinnan päälle rakennettu apukirjasto. Sisältää lukuisia usein tarvittuja apufunktioita. • Lisäksi GLUT, joka tarjoaa rajapinnan ikkunajärjestelmään. • Muissa kirjastoissa myös tukea. mm. Qt, gtk
OpenGL:n arkkitehtuuri (1/3) • OpenGL on tilakone • Piirtoa ohjataan lukuisten tilojen avulla • Kun tila on asetettu se on voimassa kunnes se muutetaan • Tilat asetetaan toisistaan riippumattomasti • Tilojen keskinäinen vuorovaikutus määrittää lopputuloksen
OpenGL:n arkkitehtuuri (2/3) • OpenGL on arkkitehtuuriltaan client-server • Hajautettu ratkaisu mahdollinen • Palvelin pitää kirjaa kunkin asiakkaan tilatiedoista (ns. GL context) • OpenGL voidaan myös nähdä liukuhihnana • Toisesta päästä syötetään dataa joka useiden vaiheiden jälkeen päätyy näytön pisteiksi
OpenGL:n arkkitehtuuri (3/3) • OpenGL:n ohjaus tapahtuu komennoilla • Komennot käsitellään saapumisjärjestyksessä • Suoritus ei välttämättä välitöntä • Ohjauskomennot annetaan APIn funktiokutsuilla • Komennoilla vaikutetaan prosessiin, jolla lopputulos saadaan aikaan, eikä niinkään sitä miltä lopputulos näyttää • Ei taetta siitä että lopputulos on täsmälleen sama kahdella eri alustalla
OpenGL rajapintana • OpenGL on matalan tason rajapinta. Sen avulla piirretään yksinkertaisia kaksi- ja kolmeulotteisia kappaleita laitteiston näyttöpuskuriin. • Piste, jana, polygoni • Lisäksi parametrisoidut käyrät ja pinnat. Nämä muunnetaan janoiksi ja polygoneiksi ennen piirtoa • Kappale koostuu yhdestä (piste) tai useammasta verteksistä.
Vilkaisu "pellin alle" • Alla karkea kaaviokuva OpenGL:n renderöintiprosessista
OpenGL API (1/3) • Funktioiden nimeämisestä • Rajapinnassa on noin 120 erilaista toimintoa • Useimpia voidaan käyttää usean eri funktion kautta käyttäen vaihtelevaa määrää erityyppisiä parametreja. • Funktiot nimetty säännönmukaisesti käytetyn parametrityypin ja parametrien lukumäärän mukaan. • Funktionimen viimeiset kirjaimet ja numerot kertovat tyypin ja parametrien lukumäärän
OpenGL API (2/3) • Alla käytetyt kirjaimet ja niitä vastaavat tyypit • Näiden lisäksi määritelty GLvoid
OpenGL API (3/3) • Esimerkki: glVertex*() • glVertex2f(2.0f, 3.0f) • glVertex3i(2, 3, 0) • glVertex4d(4.0, 1.0, -0.5, 2.0) • float v[] = {1.0f, 2.0f, 3.0f}; glVertex3fv(v)
GLUT & OpenGL perusteet (1/8) • GLUT on järjestelmäriippumaton kirjasto joka huolehtii ikkunajärjestelmästä • GLUT:n tarjoama toiminnallisuus • Ikkunoiden hallinta. Yksi sovellus voi käyttää useita ikkunoita • Callback-perustainen tapahtumankäsittely • Fonttien käsittely • Valikkojärjestelmä
GLUT & OpenGL perusteet (2/8) • Yksinkertainen esimerkki • GLUT:n käyttöönotto • glutInit() • glutInitDisplayMode() • glutInitWindowPosition() & glutInitWindowSize() • glutCreateWindow() • glutMainLoop() • Callbackien rekisteröinti
GLUT & OpenGL perusteet (3/8) • Puskureiden tyhjentäminen • glClear() • Tyypillisimmät parametrit • GL_COLOR_BUFFER_BIT – näyttöpuskuri • GL_DEPTH_BUFFER_BIT – z-puskuri • glClearColor() valitsee värin, jolla näyttö tyhjennetään • glClearDepth() asettaa z-arvon jolla z-puskuri tyhjennetään
GLUT & OpenGL perusteet (4/8) • Kuinka taata se että komennot on suoritettu • glFlush() pakottaa aloittamaan komentojen suorituksen • glFinish() kuten glFlush() mutta odottaa kunnes komennot on suoritettu
GLUT & OpenGL perusteet (5/8) • Kappaleiden piirtäminen • Piste, jana, polygoni • Polygonista kuusi erikoistapausta • Kolmio, nelikulmio, kolmionauha, kolmioviuhka, nelikulmionauha, nelikulmioviuhka • Vain yksinkertaiset polygonit sallittuja
GLUT & OpenGL perusteet (6/8) • Kappaleet määritetään glBegin() ja glEnd() kutsujen välissä. • glBegin():lle annetaan parametriksi halutun kappaleen tyyppi • Samanaikaisesti voidaan määrittää useita samantyyppisiä kappaleita • glBegin() ja glEnd() välissä vain kappaleiden määrittämiseen liittyvät funktiot sallittuja
GLUT & OpenGL perusteet (7/8) • Kappaleen verteksit määritetään glVertex*() kutsuilla • Verteksi "perii" kutsun aikana voimassa olleen värin, normaalivektorin, tekstuurikoordinaatit sekä reunalipun • Näitä voidaan vaihtaa • Väri: glColor()* tai glIndex*() • Normaalivektori glNormal*() • Tekstuurikoordinaatit: glTexCoord*() • Reunalippu: glEdgeFlag()
Tilojen hallintaa • Erilaisia asetuksia kolmenlaisia • Aina käytössä olevat • "on/off"-tyyppiset asetukset • "on/off" + parametrit • Tiloja säädellään glEnable() / glDisable()-parilla • Parametrit asetetaan omilla komennoilla • glIsEnabled() & glGet*()
Matriisit ja muunnokset (2/8) • Matriisin valinta glMatrixMode() • Modelview-matriisin muunnokset • Skaalaus: glScale*() • Kierto: glRotate*() • Siirto: glTranslate*() • "kamera": gluLookAt() • Muunnoksilla muutetaan koordinaatistoa, ei kappaletta
Matriisit ja muunnokset (3/8) • Projektiomatriisi • Perspektiiviprojektio • glFrustum() • gluPerspective() • Ortografinen projektio • glOrtho() • gluOrtho2D()
Matriisit ja muunnokset (4/8) • Normaali perspektiiviprojektio:
Matriisit ja muunnokset (5/8) • Ortografinen projektio
Matriisit ja muunnokset (6/8) • Muita matriisin käsittelyfunktioita: • glLoadIdentity() - identtinen matriisi • glMultMatrix() - kerrotaan matriisilla • glLoadMatrix() - asetetaan matriisi
Matriisit ja muunnokset (7/8) • Matriisipinot • Kullekin matriisityypille on oma pinonsa • Hierarkkisille malleille • glPushMatrix() - talletetaan nykyinen matriisi pinoon • glPopMatrix() - korvataan nykyinen matriisi pinon huipulla • Pinojen koko: • Modelview: vähintään 32 • Projektio: vähintään 2
Matriisit ja muunnokset (8/8) • Koordinaatit skaalataan ikkunan mittoihin sopiviksi • Käytössä olevan alueen kokoa ja paikkaa voidaan säätää • glViewport() • Z-koordinaatit normaalisti välillä 0-1 • Voidaan myös säätää • glDepthRange()
Näkyvyyden määrittäminen (1/4) • Taakseosoittavien monikulmoiden poistaminen • Poistetaan polygonit, jotka ovat "takaperin" • tavallisesti takaperin on polygoni jonka verteksit kiertävät vastapäivään • glEnable(GL_CULL_FACE) • Poistetaanko etu- vai takaperin olevat polygonit: glCullFace() • Kumminko päin on takaperin: glFrontFace()
Näkyvyyden määrittäminen (2/4) • Perspektiivikartioon perustuva leikkaaminen • Kaikki kappaleet tai kappaleen osat jotka ovat näkyvyyskartion ulkopuolella leikataan pois • On mahdollista määrittää ainakin 6 ylimääräistä tasoa joilla kappaleita leikataan ennen projektiota • glEnable(GL_CLIP_PLANEi) • glClipPlane()
Näkyvyyden määrittäminen (3/4) • Z-puskuri • varastoi yhden z-arvon kutakin näyttöpuskurin pikseliä kohti • tavallisesti z-arvo kuvaa etäisyyttä "kamerasta", eli suurempi -> kauempana • piirrettäessä vain sellainen fragmentti piirretään jonka z on pienempi kuin z-puskurissa ko. pikselin kohdalla oleva oleva arvo • aina kun pikseli piirretään, korvataan z-arvo
Näkyvyyden määrittäminen (4/4) • glEnable(GL_DEPTH_TEST) • puskurin toimintatavan valinta: glDepthFunc() • glClearDepth() • glClear(GL_DEPTH_BUFFER_BIT) • Kähden lähekkäisen kappaleen keskinäinen z-järjestys saattaa vaihdella ikävästi • glPolygonOffset()
Verteksitaulukot ja listat (1/5) • Verteksitaulukko • Verteksidata välitetään yhdessä tai useammassa taulukossa • Kappaleet voidaan määrittää joko suoraan taulukossa tai erillisen indeksitaulukon avulla • Mahdollistaa verteksidatan välittämisen taulukkomuodossa • Yksinkertaistaa esimerkiksi tiedostosta luetun datan käsittelyä • Indeksointi vähentää muunnoksia
Verteksitaulukot ja listat (2/5) • glEnableClientState() • Taulukot välitetään gl*Pointer() komennoilla • Color, Index, EdgeFlag, Normal, TexCoord, Vertex • eli kaikki vertekseihin vaikuttava data voidaan välittää taulukoina • taulukot myös mahdollista yhdistää: glInterleavedArrays() • glDrawArrays() - piirretään kappaleita suoraan aktiivisista taulukoista • glDrawElements() - piirretään kappaleita aktiivisista taulukoista indeksoituna
Verteksitaulukot ja listat (3/5) • Listat (Display lists) • lista johon koottu OpenGL-komentoja • varastoi sekä geometriaa että tilamuutoksia • yksinkertaistaa geometrian käsittelyä • voi tehostaa suoritusta • säilytetään palvelimella • tehokas tapa säilyttää kappaleita jotka piirretään useita kertoja • 3D-kiihdytin voi varastoida listan omaan muistiinsa
Verteksitaulukot ja listat (4/5) • Listan luominen • Pyydetään listalle tunniste glGenLists():llä • Annetaan halutut komennot glNewList()/glEndList() välissä • Kaikkia komentoja ei voi tallettaa listaan • glGet*() • Verteksitaulukot • Taulukkomuodossa annetusta datasta vain sen hetkiset arvot tallettuvat • Listoja voidaan koostaa hierarkkisesti • Myös GLU komentoja voidaan tallettaa listaan
Verteksitaulukot ja listat (5/5) • Listan käyttö • glCallList() • listaa kutsuttaessa komennot suoritetaan talletusjärjestyksessä • ei tarvita glBegin()/glEnd() • Listassa olevat tilanmuunnokset jäävät voimaan! • glCallLists() suorittaa taulukossa annetut listat
Valaistus (1/7) • Yleistä • Lokaali valaistusmalli • Valaistus lasketaan verteksiperustaisesti • Interpoloidaan muille polygonin pisteille • Ei varjoja • Malli muodostuu • Valonlähteistä • Materiaaleista • Globaaleista attribuuteista
Valaistus (2/7) • Valonlähteet • Kolmea tyyppiä: Suunnattu (directional), paikallinen (positional) ja spotti (spotlight) • Attribuutit: • sijainti/suunta • Väritys: yleis- (ambient), diffuusi- (diffuse) ja peilimäinen (specular) -väri ja intensiteetti • Vaimennus (attenuation) • Spotin leveys (kulma) ja keilan suunta • Spot exponent
Valaistus (3/7) • Materiaalit • Materiaali määrittää miten kappale reagoi valoon • Attribuutit • Heijastus: yleis- (ambient), diffuusi (diffuse), ja peilimäinen (specular) -väri ja -intensiteetti • Kiiltävyys (shininess) • Emissio (emission)
Valaistus (4/7) • Globaalit attribuutit • Globaali yleisvalo (global ambient) • Tulkitaanko "kameran" olevan paikallinen vai äärettömän kaukana (local viewer) • Valaistaanko takaperoiset polygonit • glLightModel()
Valaistus (5/7) • Valojen käyttö • OpenGL tukee ainakin 8 samanaikaista valonlähdettä • glShadeModel() • glEnable(GL_LIGHTING) • Valoja voidaan käyttää toisistaan riippumatta • glEnable(GL_LIGHTi) • Kappaleiden vertekseille määritettävä normaalivektorit
Valaistus (6/7) • Valojen parametrien asettaminen: glLight*() • Suunnattu valonlähde saadaan asettamalla valon sijainnin neljäs koordinaatti = 0 • Modelview-matriisi vaikuttaa paikallisiin valoihin. Muunnos suoritetaan samalla kun valonlähteen sijainti asetetaan • Paikallisesta valosta saadaan spotti rajoittamalla keilan leveyttä (annetaan keilen leveyden puolikas) • Vaimennuskertoimet eivät vaikuta suunnattuihin valonlähteisiin
Valaistus (7/7) • Materiaalit • glMaterial() • voidaan asettaa erikseen polygonin etu- ja takapuolelle • myös alpha-arvot voidaan asettaa, ainoastaan diffuusi-termin alphalla vaikutusta • emissiotermillä kappale voidaan saada näyttämään valonlähteeltä ("hohtamaan") • glColorMaterial()
Tekstuurit (1/16) • Tekstuureilla vähennetään "muovikappale avaruudessa" – efektiä • Tekstuuri on joko yksi- tai kaksiulotteinen datataulukko • yksittäinen elementti, "tekseli" (texel) koostuu 1-4 arvosta • 6 erilaista esitysmuotoa • RGB(A), alpha, luminanssi (+ alpha), intensiteetti
Tekstuurit (2/16) • Tekstuurien luominen • Luodaan uusi tekstuuriobjekti • Luodaan tai luetaan tekstuuridata muistiin • Generoidaan tunniste: glGenTextures() • Valmistellaan tekstuuriobjekti • Aktivoidaan luotu tekstuuriobjekti: glBindTexture() • Siirretään tekstuuridata OpenGL:n käyttöön: glTexImage2D() • Asetetaan parametrit
Tekstuurit (3/16) • Mipmaps • Etukäteen luotuja eri kokoisia "alitekstuureja" • Seuraava pienempi tekstuuri aina 1/4 edellisestä • Vähentää tekstuurien "välkettä" kappaleen koon pienentyessä -> parempi kuvanlaatu • Muistitarve +33% • Luontiin gluBuild2DMipmaps()