1 / 80

Sisältö (1/2)

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

corin
Download Presentation

Sisältö (1/2)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Sisältö (2/2) • 2. osa • Valaistus • Tekstuurit • Käyrät ja parametriset pinnat • Blending • Puskurit ja fragmentit • Sumu • Virheiden käsittely & laajennukset

  3. 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ä

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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ä.

  9. Vilkaisu "pellin alle" • Alla karkea kaaviokuva OpenGL:n renderöintiprosessista

  10. 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

  11. OpenGL API (2/3) • Alla käytetyt kirjaimet ja niitä vastaavat tyypit • Näiden lisäksi määritelty GLvoid

  12. 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)

  13. 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ä

  14. GLUT & OpenGL perusteet (2/8) • Yksinkertainen esimerkki • GLUT:n käyttöönotto • glutInit() • glutInitDisplayMode() • glutInitWindowPosition() & glutInitWindowSize() • glutCreateWindow() • glutMainLoop() • Callbackien rekisteröinti

  15. 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

  16. 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

  17. GLUT & OpenGL perusteet (5/8) • Kappaleiden piirtäminen • Piste, jana, polygoni • Polygonista kuusi erikoistapausta • Kolmio, nelikulmio, kolmionauha, kolmioviuhka, nelikulmionauha, nelikulmioviuhka • Vain yksinkertaiset polygonit sallittuja

  18. 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

  19. 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()

  20. GLUT & OpenGL perusteet (8/8)

  21. 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*()

  22. Matriisit ja muunnokset (1/8)

  23. Matriisit ja muunnokset (2/8) • Matriisin valinta glMatrixMode() • Modelview-matriisin muunnokset • Skaalaus: glScale*() • Kierto: glRotate*() • Siirto: glTranslate*() • "kamera": gluLookAt() • Muunnoksilla muutetaan koordinaatistoa, ei kappaletta

  24. Matriisit ja muunnokset (3/8) • Projektiomatriisi • Perspektiiviprojektio • glFrustum() • gluPerspective() • Ortografinen projektio • glOrtho() • gluOrtho2D()

  25. Matriisit ja muunnokset (4/8) • Normaali perspektiiviprojektio:

  26. Matriisit ja muunnokset (5/8) • Ortografinen projektio

  27. Matriisit ja muunnokset (6/8) • Muita matriisin käsittelyfunktioita: • glLoadIdentity() - identtinen matriisi • glMultMatrix() - kerrotaan matriisilla • glLoadMatrix() - asetetaan matriisi

  28. 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

  29. 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()

  30. 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()

  31. 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()

  32. 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

  33. 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()

  34. 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

  35. 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

  36. 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

  37. 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

  38. 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

  39. Valaistus (1/7) • Yleistä • Lokaali valaistusmalli • Valaistus lasketaan verteksiperustaisesti • Interpoloidaan muille polygonin pisteille • Ei varjoja • Malli muodostuu • Valonlähteistä • Materiaaleista • Globaaleista attribuuteista

  40. 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

  41. 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)

  42. Valaistus (4/7) • Globaalit attribuutit • Globaali yleisvalo (global ambient) • Tulkitaanko "kameran" olevan paikallinen vai äärettömän kaukana (local viewer) • Valaistaanko takaperoiset polygonit • glLightModel()

  43. 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

  44. 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

  45. 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()

  46. 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

  47. 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

  48. 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()

  49. Tekstuurit (4/16)

More Related