80

Sisältö (1/2)

  • 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

Page 1: Sisältö (1/2)
Page 2: 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

Page 3: Sisältö (1/2)

Sisältö(2/2)

2. osa

Valaistus

Tekstuurit

Käyrät ja parametriset pinnat

Blending

Puskurit ja fragmentit

Sumu

Virheiden käsittely & laajennukset

Page 4: Sisältö (1/2)

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ä

Page 5: Sisältö (1/2)

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

Page 6: Sisältö (1/2)

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

Page 7: Sisältö (1/2)

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

Page 8: Sisältö (1/2)

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

Page 9: Sisältö (1/2)

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

Page 10: Sisältö (1/2)

Vilkaisu "pellin alle"

Alla karkea kaaviokuva OpenGL:n renderöintiprosessista

Page 11: Sisältö (1/2)

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

Page 12: Sisältö (1/2)

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

Page 13: Sisältö (1/2)

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)

Page 14: Sisältö (1/2)

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ä

Page 15: Sisältö (1/2)

GLUT & OpenGL perusteet (2/8)

Yksinkertainen esimerkki

GLUT:n käyttöönotto

glutInit()

glutInitDisplayMode()

glutInitWindowPosition() & glutInitWindowSize()

glutCreateWindow()

glutMainLoop()

Callbackien rekisteröinti

Page 16: Sisältö (1/2)

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

Page 17: Sisältö (1/2)

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

Page 18: Sisältö (1/2)

GLUT & OpenGL perusteet (5/8)

Kappaleiden piirtäminen

Piste, jana, polygoni

Polygonista kuusi erikoistapausta

Kolmio, nelikulmio, kolmionauha, kolmioviuhka, nelikulmionauha, nelikulmioviuhka

Vain yksinkertaiset polygonit sallittuja

Page 19: Sisältö (1/2)

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

Page 20: Sisältö (1/2)

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

Page 21: Sisältö (1/2)

GLUT & OpenGL perusteet (8/8)

Page 22: Sisältö (1/2)

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

Page 23: Sisältö (1/2)

Matriisit ja muunnokset(1/8)

Page 24: Sisältö (1/2)

Matriisit ja muunnokset(2/8)

Matriisin valinta glMatrixMode()

Modelview-matriisin muunnokset

Skaalaus: glScale*()

Kierto: glRotate*()

Siirto: glTranslate*()

"kamera": gluLookAt()

Muunnoksilla muutetaan koordinaatistoa, ei kappaletta

Page 25: Sisältö (1/2)

Matriisit ja muunnokset(3/8)

Projektiomatriisi

Perspektiiviprojektio

glFrustum()

gluPerspective()

Ortografinen projektio

glOrtho()

gluOrtho2D()

Page 26: Sisältö (1/2)

Matriisit ja muunnokset(4/8)

Normaali perspektiiviprojektio:

Page 27: Sisältö (1/2)

Matriisit ja muunnokset(5/8)

Ortografinen projektio

Page 28: Sisältö (1/2)

Matriisit ja muunnokset(6/8)

Muita matriisin käsittelyfunktioita:

glLoadIdentity() - identtinen matriisi

glMultMatrix() - kerrotaan matriisilla

glLoadMatrix() - asetetaan matriisi

Page 29: Sisältö (1/2)

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

Page 30: Sisältö (1/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()

Page 31: Sisältö (1/2)

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

Page 32: Sisältö (1/2)

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

Page 33: Sisältö (1/2)

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

Page 34: Sisältö (1/2)

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

Page 35: Sisältö (1/2)

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

Page 36: Sisältö (1/2)

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

Page 37: Sisältö (1/2)

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

Page 38: Sisältö (1/2)

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

Page 39: Sisältö (1/2)

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

Page 40: Sisältö (1/2)

Valaistus(1/7)

Yleistä

Lokaali valaistusmalli

Valaistus lasketaan verteksiperustaisesti

Interpoloidaan muille polygonin pisteille

Ei varjoja

Malli muodostuu

Valonlähteistä

Materiaaleista

Globaaleista attribuuteista

Page 41: Sisältö (1/2)

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

Page 42: Sisältö (1/2)

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)

Page 43: Sisältö (1/2)

Valaistus(4/7)

Globaalit attribuutit

Globaali yleisvalo (global ambient)

Tulkitaanko "kameran" olevan paikallinen vai äärettömän kaukana (local viewer)

Valaistaanko takaperoiset polygonit

glLightModel()

Page 44: Sisältö (1/2)

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

Page 45: Sisältö (1/2)

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

Page 46: Sisältö (1/2)

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

Page 47: Sisältö (1/2)

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

Page 48: Sisältö (1/2)

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

Page 49: Sisältö (1/2)

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

Page 50: Sisältö (1/2)

Tekstuurit (4/16)

Page 51: Sisältö (1/2)

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

Page 52: Sisältö (1/2)

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

Page 53: Sisältö (1/2)

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!

Page 54: Sisältö (1/2)

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

Page 55: Sisältö (1/2)

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

Page 56: Sisältö (1/2)

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ä

Page 57: Sisältö (1/2)

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)

Page 58: Sisältö (1/2)

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

Page 59: Sisältö (1/2)

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

Page 60: Sisältö (1/2)

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

Page 61: Sisältö (1/2)

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

Page 62: Sisältö (1/2)

Tekstuurit (16/16)

Page 63: Sisältö (1/2)

Käyrät ja pinnat(1/4)

Page 64: Sisältö (1/2)

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

Page 65: Sisältö (1/2)

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

Page 66: Sisältö (1/2)

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

Page 67: Sisältö (1/2)

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ä

Page 68: Sisältö (1/2)

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);

Page 69: Sisältö (1/2)

Blending(3/4)

Page 70: Sisältö (1/2)

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

Page 71: Sisältö (1/2)

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

Page 72: Sisältö (1/2)

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

Page 73: Sisältö (1/2)

Puskurit(3/5)

Fragmenttioperaatiot:

Scissor test

Alpha test

Stencil test

Depth test

Blending

Looginen operaatio

Page 74: Sisältö (1/2)

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

Page 75: Sisältö (1/2)

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

Page 76: Sisältö (1/2)

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ä

Page 77: Sisältö (1/2)

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

Page 78: Sisältö (1/2)

Sumu(2/2)

Page 79: Sisältö (1/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

Page 80: Sisältö (1/2)

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