Juha-Pekka Jokela | jpjokela@surfeu.fi
Tinygl-kurssi, osa 4

Ajankohtaiset

Boogien palsta

Boogie

Star Wreck -spesiaali

Eletään tylsää tulevaisuutta

Tohtori AivoTurmio

Ohjelmointia: AHI, MorphOS, Tinygl

Juha Niemimäki, Ilkka Lehtoranta, J-P Jokela

0xAA - Codex Alpe Adria 2005

Sami Ylönen

Kun PCisti Amigaan ryhtyi

Tero Säärelä

Videokaappari käytettynä?

Jarmo Piippo

Tinygl on MorphOS:n opengl-yhteensopiva 3D-rajapinta, joka löytyy MorphOS:n versiosta 1.4 tai sitä uudemmista. Kurssi sopii kaikille, jotka ovat kiinnostuneita opengl-ohjelmoinnista. Kurssin osat 1 ja 2 käsiteltiin Sakussa #47 (1/2005), osa 3 Sakussa #48 (2/2005). Tällä kertaa aiheena on kaksi asiaa: teksturointi ja 2-ulotteisen grafiikan piirtäminen.

Teksturointi

Tekstuurien lataamisen helpottamiseksi ja yksinkertaistamiseksi teen sen SDL:llä. Käytettyjä SDL-funktioita en selitä (ainakaan vielä tällä kertaa), opengl on pääasia.

Kuvien lataamisen lisäksi myös näppäimistön lukeminen kannattaa tehdä SDL:llä. Onnistuu se opengl-funktioillakin, mutta tällöin tulee ongelmia mm. usean samanaikaisen näppäinpainalluksen kanssa. En suosittele, jos tarkoituksena on tehdä jotain vähänkin enemmän tarkkuutta vaativaa.

Tuttuun tapaan teksturoinnin saa käyttöön funktiokutsulla
glEnable(GL_TEXTURE_2D) ja pois käytöstä vastaavalla glDisable() -kutsulla.

glBindTexture() asettaa tekstuurin käyttöön (lataamista tai piirtämistä varten). Funktiota ei saa kutsua glBegin() ja glEnd() välissä!

gluBuild2DMipmaps() luo tekstuurista useita versioita eri tarkkuuksilla, joita käytetään etäisyyden mukaan.

glTexCoord2f() määrittää, mitä tekstuurin pistettä seuraava vertex vastaa. Normaalisti arvot voivat olla väliltä 0.0 ja 1.0. Yksittäistä quadia teksturoidessa ei (ylensä) tarvitse muita arvoja kuin 0.0 ja 1.0, mutta arvot voivat olla toki mitä tahansa annetulta väliltä. Tämä kannattaa pitää mielessä, kun teksturoi useammasta polygonista muodostuvaa objektia.

2D-grafiikan piirtäminen

Yleensä kolmiulotteisissa peleissä tarvitsee osa grafiikasta (esimerkiksi pisteet ym.) piirtää kaksiulotteisesti. Tässä hieman ohjeistusta siitä, miten se onnistuu käytännössä opengl-funktioiden avulla.

glOrtho(left, right, bottom, top, znear, zfar) ottaa käyttöön projektion, jossa syvyydellä ei ole merkitystä kappaleiden sijaintiin näytöllä.. Left, right, bottom ja top määrittävät ruudun reunojen koordinaatit. Asettamalla arvot vastaamaan ikkunan kokoa päästään tilanteeseen, jossa X -ja Y-koordinaatit vastaavat suoraan ikkunan pikseleitä.

glVertex2i() antaa vertexille 2 koordinaattia integer-muodossa. Z-koordinaatti on tällöin automaattisesti 0.

Esimerkkiohjelma piirtää ruudun täyteen levyltä ladatulla tekstuurilla. 3D-grafiikan piirtoa esimerkissä ei ole, mutta homma hoituu samalla tavalla myös 3D-grafiikan piirtämisessä, kun vain antaa jokaiselle vertexille myös tekstuurikoordinaatin.

Tekstuuri
© André Siegel.

Uusimmissa julkisissa 3D-ajureissa on bugi, jonka takia tuplapuskuroidulla ikkunalla ensimmäinen frame piirretään päällimmäisenä olevaan puskuriin. Tämän jälkeen puskurin vaihto tietenkin tuo näkyviin tyhjän ruudun... Ohjelmissa, joissa näyttöä päivitetään jatkuvasti bugia ei edes huomaa, mutta ohjelmissa, joissa piirretään vain 1 frame (kuten tässä esimerkissä), lopputuloksena on tyhjä ruutu. Yksinkertaisin ratkaisu, jota tässäkin esimerkissä käytetään, on piirtää kuva kahteen kertaan.

Esimerkkikoodi
Makefile osalle neljä

Sivun alkuun