Upload
corin
View
59
Download
0
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
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
Merkki Tyyppi OpenGL tyyppib 8 bit integer GLbytes 16 bit integer GLshorti 32 bit integer GLintf 32 bit float GLfloatd 64 bit float GLdoubleub 8 bit unsigned integer GLubyte, GLbooleanus 16 bit unsigned integer GLushortui 32 bit unsigned integer GLuint, GLenum, GLbitfield
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()
GLUT & OpenGL perusteet (8/8)
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(1/8)
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()
Tekstuurit (4/16)
Tekstuurit (5/16)
Tekstuurin käyttö
glEnable(GL_TEXTURE_2D)
Aktivoidaan haluttu tekstuuri glBindTexture()
Asetetaan vertekseille tekstuurikoordinaatit glTexCoord2D()
Tekstuurikoordinaatit välillä 0-1
Koordinaatit muunnetaan tekstuurimatriisilla
Tekstuurit (6/16)
Mitä tehdä jos tekstuurikoordinaatti on välin 0-1 ulkopuolella?
Voidaan toistaa uudelleen 1.1 -> 0.1, jne
Voidaan leikata 1.4 -> 1.0, -0.4 -> 0, jne
Voidaan valita vapaasti sekä vaaka että pystysuuntaan
glTexParameter()
GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T
GL_CLAMP tai GL_REPEAT
Tekstuurit (7/16)
Tekstuurikoordinaattien muunnokset
Tekstuurikoordinaatit neliulotteisia aivan kuin normaalit koordinaatitkin (s, t, r, q)
Tavallisesti r jätetään huomioimatta
Tavallisesti q = 1
Tekstuurikoordinaateilla samanlainen 4x4 matriisi kuin tavallisillekin koordinaateille
Kaikki muunnokset mahdollisia, jopa perspektiivi!
Tekstuurit (8/16)
Ongelma: yksi tekseli vastaa vain harvoin yhtä näytön pikseliä
Tekstuuria on suodatettava, eli joko "venytettävä" tai "kutistettava" tarpeen mukaan
Tekstuurit (9/16)
Suodatustapa voidaan valita
Valinta erikseen suurennukselle ja pienennykselle
Voidaan valita miten mipmapeja käytetään
Kuvan laatu vs. vaadittu laskentateho
Vaihtoehdot joko lähimmän tekselin valinta tai interpolointi
Tekstuurit (10/16)
Valinta glTexParameter()-kutsulla
GL_TEXTURE_MAG_FILTER
GL_TEXTURE_MIN_FILTER
Suurennussuodatin
Aina käytössä suurin mipmap
Vaihtoehdot
GL_NEAREST – valitaan lähin tekseli
GL_LINEAR – lasketaan arvo neljästä lähimmästä tekselistä
Tekstuurit (11/16)
Pienennyssuodatin
Voidaan valita käytetäänkö mipmapeja vai ei
Voidaan valita käytetäänkö yhtä vai kahta lähintä mipmapia
Vaihtoehdot
GL_NEAREST, GL_LINEAR – kuten edellä
Käytetään yhtä mipmapia: GL_NEAREST_MIPMAP_(NEAREST | LINEAR)
Lasketaan arvo kahden mipmapin arvoista:
GL_LINEAR_MIPMAP_(NEAREST | LINEAR)
Tekstuurit (12/16)
Tekstuurimoodit (funktiot)
Lopputulosta voidaan muokata tekstuurimoodilla
Lopputulokseen vaikuttaa kolme tekijää
Väri, tekstuuri sekä GL_TEXTURE_ENV_COLOR
lopputuloksen tekstuurimoodi käytetyn tekstuurin esitysmuodon määrittämänä
neljä erilaista tekstuurimoodia
Decal, Replace, Blend, Modulate
Tekstuurit (13/16)
Decal
Vain GL_RGB ja RGBA sallittuja esitysmuotoja
GL_RGB -> tekstuuri sellaisenaan
GL_RGBA -> osittainen läpinäkyvyys
Replace
Korvaa esitysmuodosta riippuen joko näyttöpuskurin väri-, alpha- tai molemmat arvot
Tekstuurit (14/16)
Modulate
Kertoo tekstuurin ja näyttöpuskurin väri- ja/tai alpha-arvot keskenään
Tekstuuri + valaistus
Blend
Sekoittaa GL_TEXTURE_ENV_COLOR värin ja näyttöpuskurin värin tekstuurin arvoilla painotettuna
Tekstuurit (15/16)
Kehittyneempiä tekniikoita
Multitexturing
Useita “päällekäisiä” tekstuureita
mm. ns. “lightmapping”
Tekstuurien priorisointi & ns. "resident textures"
Tärkeää kiihdyttimiä käytettäessä
Texture proxy
Tekstuurikoordinaattien automaattinen generointi
mm. environment mapping
Tekstuurit (16/16)
Käyrät ja pinnat(1/4)
Käyrät ja pinnat(2/4)
OpenGL ei sellaisenaan tue em. kappaleita
Ne on muutettava janoiksi ja polygoneiksi ennen piirtämistä
OpenGL:n evaluaattorit
Perustana Bezier-käyrät ja pinnat
Soveltuvat: mm. B-Spline, NURBS-pinnat
Käyrät ja pinnat(3/4)
Evaluaattoreiden käyttö
Määritetään ohjauspisteet halutuille evaluaattoreille: glMap*f()
Otetaan halutut evaluaattorit käyttöön: glEnable(GL_MAP?_*)
Evaluoidaan: glEvalCoord*()
Helpompi tapa:
Luodaan tasavälinen "portaikko": glMapGrid*()
Evaluoidaan halutulla askelvälillä: glEvalMesh*()
Käyrät ja pinnat(4/4)
Evaluointi mahdollista myös tekstuurikoordinaateille, normaalivektoreille, värille
Samanaikaisesti mahdollista evaluoida yhtä tai useampaa muuttujaa
GLU-kirjaston NURBS-toiminnot evaluaattoreita monipuolisempia
Blending(1/4)
keino yhdistää kaksi tai useampaa kuvaa tai kuvan osaa "sekoittamalla" niiden pikselit
yhdistää näyttöpuskurin pikselin ja liukuhihnalta tulevan fragmentin halutulla funktiolla
Alphakomponentti
funktio: RsCs + RdCd
Piirtojärjestyksellä on siis merkitystä
Blending(2/4)
glEnable(GL_BLEND)
Kertoimet määrittävä funktio: glBlendFunc()
tavallisin tapaus:
glBlendFunc(GL_ONE, GL_ZERO) + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
"static lightmaps":
glBlendFunc(GL_ONE, GL_ZERO) + glBlendFunc(GL_DST_COLOR, GL_ZERO);
Blending(3/4)
Blending(4/4)
Z-puskuri aiheuttaa ongelman
Läpinäkyvät pinnat estävät takana olevien pintojen piirtämisen
Ratkaisu:
Läpinäkyville pinnoille sallitaan vain luku z-puskurista
glDepthMask()
Puskurit(1/5)
Kuvan muodostava tieto talletetaan puskureihin
Näyttöpuskurit (color buffer)
Vähintään yksi puskuri
Stereokuvatuki mahdollinen (kaksi puskuria)
Kaksoispuskurointituki mahdollinen
Mahdollisesti lisäpuskureita (auxiliary buffer)
z-puskuri
Stencil buffer
Accumulation buffer
Puskurit(2/5)
Toteutuksesta riippuen kaikki puskurit eivät välttämättä ole käytettävissä
Stencil buffer
Käytetään rajoittamaan piirtoa pikselin tarkkuudella
Accumulation buffer
Sisältää väridataa
Käytetään lopullisen kuvan koostamiseen
Esim. Antialiasing
Puskurit(3/5)
Fragmenttioperaatiot:
Scissor test
Alpha test
Stencil test
Depth test
Blending
Looginen operaatio
Puskurit(4/5)
Scissor test
Näytöltä voidaan rajata neliskulmainen alue jonka ulkopuolelle ei piirretä
glEnable(GL_SCISSOR_TEST)
glScissor()
Alpha test
Fragmentti voidaan hylätä sen alpha-arvon perusteella
glEnable(GL_ALPHA_TEST)
glAlphaFunc()
Puskurit(5/5)
Stencil test
Fragmentti voidaan hylätä stencil bufferin arvon perusteella
glEnable(GL_STENCIL_TEST)
glStencilFunc() & glStencilOp()
Looginen operaatio
Bitittäinen operaatio
glEnable(GL_COLOR_LOGIC_OP); glLogicOp()
KuvanlaatuSuoritusnopeus vs. kuvanlaatu – kompromissi
glHint()
Vaikutus toteutusriippuvainen
Kappaleiden antialiasointi, tekstuurien perspektiivikorjaus, sumu
Kolme vaihtoehtoaGL_NICEST – paras kuvanlaatu
GL_FASTEST – nopein suoritus
GL_DONT_CARE – ei väliä
Sumu(1/2)
Sumun avulla saadaan kauempana olevat kappaleet "hämärtymään"
Soveltuu näkyvyyden rajoittamiseen
glEnable(GL_FOG)
glFog*()
Lineaarinen tai eksponentiaalinen
parametrit:Lineaarinen: alku- ja loppuetäisyys
Exponentiaalinen: tiheys
Sumu(2/2)
OpenGL Laajennukset
Lista ajurin tukemista laajennuksista: glGetString(GL_EXTENSIONS)
Nimien alussa kaksi lyhennettä
Laajennuksen tyyppi: GL, GLU, GLX, WGL...
Mikä taho vastaa laajennuksesta:
ARB – ARB:n hyväksymä laajennus
EXT – useamman toimittajan hyväksymä laajennus
INTEL, SGI, NV, WIN.... toimittajakohtaisia
Laajennusten käyttöönotto alustakohtaista
Virheiden käsittely
Viimeisin virhekoodi: glGetError()
Kutsun jälkeen virhekoodi nollataan
Ei virhettä viimeisimmän glGetError() kursun jälkeen: GL_NO_ERROR
Virhekoodi merkkijonona: gluGetErrorString()