OpenGl 3D Grafiikkakirjasto

11.1.1999
Janne Pänkälä
Sähkö
Teknillinen korkeakoulu.
epankala@cc.hut.fi

Tiivistelmä:

OpenGL on SGI:n luoma standardi 2 ja 3 ulotteisen grafiikan esittämiseen.
Se tarjoaa hyvin määritellyn rajapinnan jonka avulla on helppo toteuttaa 3D grafiikkaa ilman suurempaa perehtymistä matriisi yms matematiikkan saloihin. Tiedot ohjelmointirajapinnasta ovat kaikkien saatavilla ja OpenGL ohjelmia ja peleja on jo useita erilaisia (mm. Quake käyttää OpenGL:ää rajapintanaan) [4] [2].
Koska OpenGL toteutus löytyy useille eri konearkkitehtuureille on sillä kirjoitetut ohjelmat helppo siirtä eri käyttöjärjestelmiin.
(mm. Digital Unix, Solaris, NetBSD, FreeBSD , Windows[NT.*|Win9.*], AIX, HP, Linux, OS/2, SGI, BeOS)

1. Johdanto

Konetehojen noustessa ja näyttöteknologian kehittyessä on mahdollista tuottaa tietokoneella yhä luonnollisemman näköisia kolmiulotteisia toteutuksia. Koska luonnollisten kolmiulotteisten kuvien tuottaminen vaatii monia kaavoja muunmuassa esineiden kääntelystä, valaistuksen ja varjojen laskemisesta sekä läpikuultavien esineiden esittämisestä ei niiden erillinen toteuttaminen enään tule kuuloonkaan jos ruvetaan tekemään suurempaa 3D toteutusta esimerkiksi peliä tms.
Tämän takia yleisesti käytetään valmiita 3D kirjastoja jotka tarjoavat valmiin rajapinnan lähes kaikille tarvittaville grafiikka funktioille (OpenGL:ssä ~250 eri funktiota) ilman että ohjelmoijan pitää osata kirjoittaa kaikkia toimintoja itse. Tällä hetkellä yleisimmin käytetyt kirjastot ovat OpenGL ja Direct3D (jälkimmäinen vain M$ käyttöön tai Wine:n kanssa)[3].

2. OpenGL mitä,missä,milloin...

Aikoinaan kun SGI vielä piti hallussaan tietokoneiden graafisen puolen valtikkaa tuotti se grafiikan ohjelmoimiseen tarkoitetun aliohjelmakirjaston GL:n. Tästä esi-isästä on OpenGL lähtöisin ja se näki päivänvalon vuonna 1992 jonka jälkeen se on siirretty monille eri arkkitehtuureille ja on kivunnut de-facto standardiksi 3D ohjelmoinnissa.
koska OpenGL on suunniteltu laitteisto riippumattomaksi ja SPEKSIT ovat kaikkien vapaasti saatavilla on kyseinen grafiikka kirjasto toteutettu jo monelle eri arkkitehtuurille/käyttöjärjestelmille mm. Digital,HP,Sun,Win,Linux,BeOS,OS/2, ... , ... ja tietysti SGI.
Kaikki OpenGL kirjastot jotka tiedän on kirjoitettu C:llä tai C++:lla , mutta wrappereitä muihinkin kieliin on toki tehty mm. PythonGL.

2.1 Rajapinta.

OpenGL kirjaston kaskyt ovat helppoja ymmärtää koska kaikki grafiikkakirjaston komennot ovat muotoa
gl (eg. glIsEnabled(GL_TEXTURE2D) ) tai
gl (eg. glColor3f(0.3,0.5,0.0) )

tästä koodia lukeva näkee helposti mitä ollaan tekemässä ja mistä kirjastosta aliohjelmaa kutsutaan.
gl -> libgl, glu -> libglu, glut -> libglut (näistä lisää myöhemmin)

Eli OpenGL funtioiden perus syntaksi on muotoa.
gl[library_name][function_name][number_of_args][type_of_args](...);
number_of_args = {2,3,4} alla olevassa taulukossa [type_of_args] kentän mahdollliset vaihtoehdot b:stä v:hen[1] .

lyhenne      datatyyppi			C-kielessä             OpenGL :ssä

b 8-bit integer signed char Glbyte s 16-bit integer short Glshort i 32-bit integer long GLint, GLsizei f 32-bit floating-point float GLfloat, GLclampf d 64-bit floating-point double Gldouble, Glclampd ub 8-bit unsigned integer unsigned char Glubyte, Glboolean us 16-bit unsigned integer unsigned short Glushort ui 32-bit unsigned integer unsigned long GLuint, Glenum, Glbitfield v vector void * void *

2.2 Sanastoa

  • View = renderöinnin lopputulos joka näkyy monitorista. Siinä voi olla yksi objekti (tai useita esim. Iris )[5]
  • Projection = Tapa miten luodaan (lasketaan) View. Näitä on useampia erilaisia ja koska kuva puhuu enemmän niin yksi esimerkki. glFrustum (saa argumentikseen juurikin nuo 6 arvoa)[5]
  • Primitive = piste, viiva, polygoni, bitmap tai kuva.
  • Object = malli joka koostuu yhdesta tai useammasta Primitiivistä.[5]
  • Wireframe = esitys Objektista joka koostuu vain viivoista.[5]
  • Solidframe = kuten wireframe, mutta välit täytetty pinnoilla (jotka mahdollisesti valaistuja).[5]
  • Antialiasing = tekniikka joka muuttaa värejä objektien / primitiivien pinnalla saadakseen aikaiseksi luonnollisemman vaikutelman "palikkamaisuuden" sijasta (tämä vaatii usein perusteellisesti tehtynä raskasta laskentaa esim 4-way antialiasin vaatii että tarkistetaan halutun pikselin ylä,ala,oik,vas puolella olevien pikseleiden kirkkaus ja niiden perusteella lasketaan miten muutetaan pikselin väriä).[5]

2.3 OpenGL:n tilakone ominaisuudet.

OpenGL rakenne sisältää itseasiassa ns. "tilakoneen" ja sen tilojen asettamiseen rajapinta tarjoaa monia funktioita joilla tiloja voi asettaa päälle/pois/toiseen asentoon eikä niistä tarvitse huolehtia sen enempää ohjelmoinnissa.
Muun muassa väri on yksi tilamuuttuja, kun se asetetaan johonkin arvoon tehdään kaikki sen jälkeen samalla värillä siihen asti kunnes väri muutetaan.
Muut tilat kontroilloivat mm. valaistusta, projektiota, teksturointia, viivan piitotapaa, materiaali ominaisuuksia, ... listaa voisi jatkaa vielä pitkälle. Kaiken kaikkiaan säädeltäviä tiloja on ~200 erilaista.

2.4 Toimintojen järjestys (kuvan renderöinnissä)

Kun Objekteja käännetään (renderöidään) kuvaksi niin se tapahtuu ennalta määritellyssä järjestyksessä.
OpenGL Programming Guide (2nd ed.)[5]
Yllä on OpenGL:n "pipeline" eli kuvaus siitä missä järjestyksessä toiminteet suoritetaan syötetylle datalle jotta saadaan aikaiseksi haluttu lopputulos Framebufferiin.
  • luodaan muodot geometrisista primitiiveistä, eli muunnetaan ne matemaattisiksi kuvauksiksi objekt(e)ista.
  • Siirretään objekti(t) kolmiuloitteiseen avaruuteen ja valitaan paikka ja suunta mistä katsomme sitä avaruutta.
  • Lasketaan värit kaikille objekteille. Väri voi tulla suoraan primitiiviltä tai sitten se lasketaan riippuen valosta/varjosta, materiaalista, teksturesta, yms
  • Muunnetaan matemaattinen kuvaus objekteista ja niihin liittyvistä väritiedoista sopiviksi jotta ne voidaan esittää näytöllä pikseleinä. (rasterization)
  • Kun kuva on piirretty framebufferiin se vaihdetaan (glSwapBuffers()) jo näkyvän kuvan tilalle ja lasketaan jo uutta. Kun tätä tehdään 25+ kertaa sekunnissa saamme animoidun vaikutelman.

3 3D kiihdyttimet.

Valmiiksi määritellyssä rajapinnassa on myös se etu että kun halutaan siirtyä ohjelmallisesta piirrosta kovo pohjaiseen (eg. Voodoo,TNT,Extra prosesor intructions) niin pitää muuttaa vain OpenGL kirjastot siten että ne osaavat hyödyntää 3D kiihdytintä ja tämän jälkeen kaikki ohjelmat rupeavat käyttämään hyväkseen kiihdytintä. (paitsi ne jotka on staattisesti käännetty OpenGL kirjastoa vastaan. Nämä pitää vain kääntää uudelleen kiihtydystä tukenvaa kirjastoa vastaan).

4.1 3D Kortit
Oheisessa kuvassa näkyy mikä on nykyään grafiikka korttien osuus kuvan muodostuksesta.
3D kortti hoitaa valaistuksen,antialiasoinnin yms toiminnot. Koneen täytyy syöttää sille nykyään lähinnä enään esineiden "World" koordinaatit (eli missä mikäkin esine sijaitsee ja missä asennossa se on muihin nähden) ja tiedot pintojen ominaisuuksista. Näistä tiedoista kortti osaakin sitten tehokkaasti laskeskella valon heijastuksia, antialiasointia, tekstureita pinnoille, pinnan varjostuksia, yms.
http://www.cgl.uwaterloo.ca/~vtluu/Talks/OpenGL/pipeline.gif
3.2 Prosessori käskyt
Yleensä kolmiuloitteisissa sovellutuksissa pyritään mahdollisimman näyttäviin toteutuksiin ja se vaatii sen että esineet (objects) muodostuvat tarpeeksi monista primitiiveistä joiden sijainti kerrotaan suhteessa toisiin pisteisiin ja näistä muodostuu esineen koordinaatit (model coordinates).
Koska näkymissä on usein useita esineitä on model koordinaatteja huomattava määrä. Tämän takia kaikkien niiden muuntaminen world koordinaateihin (jotka välitetään siis 3D korteille) on raskas operaatio ja sitä helpottamaan on markkinoille ilmestynyt AMD:ltä 3DNow ja Inteliltä KNI jotka nopeuttavat huomattavasti koordinaattien laskemista Model koordinaateista World koordinaateiksi.

copyright (c) 1999 Intel

4. OpenGL lisäkirjastot.

  • glu (openGL Utility library)
    sisältää useita rutiineita jotka kutsuvat alemmantason GL rutiineja. Näitä funktioita käytetään mm. projisointi , pintojen luomiseen ja polygonien pilkkomiseen tarkoitettujen, matriisien luomiseen.
  • glut (openGL Utility Toolkit)
    järjestelmästa riippumaton työkalukirjasto. käytetään piilottamaan ikkunointijärjestelmien monimutkaisuutta. esim ikkunan luominen on yksi komento glutCreateWindow() sen sijaan että joutuisi kutsumaan useita eri funktioita glx,wgl,pgl,agl tai jostain muusta kirjastosta.
  • glx. koska eri käyttöjärjestelmissä ja arkkitehtuureissa saattaa rajapinta kuvan näyttämiselle monitorilla olla erilainen on olemassa erillinen kirjasto joka tarjoaa tähän sopivan rajapinnan. glX on kirjasto joka tarjoaa tarvittavat funktiota OpenGL:n esittämiseen X window systems:ssä.
  • wgl. kuten glx, mutta windowsille.
  • pgl. kuten glx, mutta OS/2 warp:lle
  • agl kuten glx, mutta applen käyttikselle.

5. OpenGL toteutuksia

OpenGL ja DirectX3D sanoista tulee nykyään helposti ensimmäiseksi mieleen pelit, mutta sillä on lukuisia muitakin toteutuksia muunmuassa suunnittelu, tiede, erikoisefektit (esim elokuvissa)

Lähdeluettelo

[1] Anon, Wine Development HQ, unknown, [23.3.1999]
< http://www.winehq.com >
[2] Anon, The Mesa 3D Graphics Library, 22.3.1999 [23.3.1999]
< http://www.mesa3d.org >
[3] Hewlet Packard, OpenGL 1.1 Reference: Table of Contents , 18.6.1998, [27.9.1998]
< http://www.hp.com/unixwork/products/grfx/OpenGL/Web/Reference.html >
[4] M Segal, K Akeley, The OpenGL Graphics System: A Specification (Version 1.1) unknown, [23.3.1999]
< http://trant.sgi.com/opengl/docs/Specs/glspec1.1/glspec.html >
[5] Mason Woo, Jackie Neider, Tom Davis, OpenGL Programming Guide (2nd edition) , Addison Wesley Developers Press, Unknown 1997, 650 s.

Lisätietoja

Overview of OpenGL
Perus tietoutta OpenGL:stä
OpenGL - High Performance 2D/3D Graphics
OpenGL ryhmän kotisivut
OpenGL WWW Center
SGI:n OpenGL sivut
Tietotekniikan LuK-tutkielma
Petteri Varjuksen tekemä tutkielma OpenGL:stä
Moonlight Creator Home
3D mallintaja joka käyttää hyväkseen OpenGL kirjastoja
Introduction to OpenGL on Windows
OpenGL ohjelmoinnista Windows koneella (Ranskaksi)
The OpenGL Graphics Interface
OpenGL specsit ja documentoinnit löytyvät täältä.
news://comp.graphics.api.opengl
Keskustelu foorumi OpenGL apiin liittyvistä asioista
Nate Robins - OPENGL
Nate Robins:in OpenGL sivut. (tietoa mm OpenGL:stä windowsissa)
OpenGL Talk Presentation
OpenGL esitys. Lyhyt ja yksinkertainen selitys siitä mitä OpenGL on (englanniksi)