Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Grafiikkaa Free Pascalilla?

Sivun loppuun

Triton [08.11.2007 17:03:31]

#

Terve!

Eli olen jo jonkin aikaan ohjelmoinut Pascalilla sekä VB:llä, ja nyt tuli kysymys sitten omatekosten pelien grafiikasta. Eli miten saa FreePascaliin ladattua grafiikka, ja onko olemassa jotain tutoriaaleja? Olen kuullut myös OpenGL, mutta miten sitä käytetään ja mikä se tarkkaa ottaen on? Ja jos haluaa peleihin 3D -grafiikkaa, niin täytyykö siihen käyttää jotakin mallinnusohjelmaa vai tehdäänkö peligrafiikka erilailla? Ja onko grafiikka ohjelmointiin olemassa jotain kirjoja ymt?

Tulipa kysymyksiä paljon :) No mutta olis tosi kiva jos joku tietäis!

Metabolix [08.11.2007 17:29:03]

#

Jotta ohjelma toimisi monella alustalla, kannattaa valita jokin yleinen grafiikkakirjasto kuten SDL. OpenGL mahdollistaa laitteistokiihdytyksen käytön, mutta sille täytyy luoda ikkuna jollain muulla, vaikkapa SDL:llä. SDL:n sivuilta saa kaiken siihen tarvittavan (Pascal-unitin Languages-sivulta), OpenGL tulee kaiketi jo FP:n mukana. Putkan oppaat SDL:stä ja SDL:n ja OpenGL:n yhteiskäytöstä pätevät myös Pascaliin, luultavasti ymmärrät C-koodia aivan riittävästi, kun et väkisin yritä olla ymmärtämättä. ;) Joitakin eroja nimeämisissä on, kun C:stä poiketen merkkien koko ei Pascalissa merkitse.

Minulla ainakin SDL näytti toimivan hyvin ilman kummempaa säätöä ihan vain kääntelemällä paketin tiedostot. Paketti vain alkaa olla melkoisen vanhentunut, voisikin tehdä tuosta oman version.

uses
  SDL, SDL_Video, SDL_Events, SDL_Timer,
  GL;

Triton [08.11.2007 18:11:47]

#

Oon nyt ihan jäässä eli mitä tarkotat tiedostojen kääntelyllä? :D

Metabolix [08.11.2007 18:59:57]

#

Termit hakusessa vai koko asia? Suomenkielisen Wikipedian artikkeli oli aika kehno, mutta jos englanti taittuu, niin lue sieltä: http://en.wikipedia.org/wiki/Compiler

for i in *.pp; do ppc386 $i; done

Tai kun et käytä Linuxia, joudut joko kääntämään kaikki erikseen tai etsimään muualta apua ongelmaan.

# ls *.pp
sdl.pp sdl_audio.pp sdl_cdrom.pp ...
# ls sdl.*
sdl.pp
# ppc386 sdl.pp
Free Pascal Compiler version 2.0.4 [2007/02/02] for i386
Copyright (c) 1993-2006 by Florian Klaempfl
Target OS: Linux for i386
Compiling sdl.pp
100 Lines compiled, 0.0 sec
# ls sdl.*
sdl.o  sdl.pp  sdl.ppu
# ppc386 sdl_audio.pp
...

Markus [09.11.2007 11:11:43]

#

Mitenhän pitkän tarinan tähän jaksaisi kirjoittaa... ... pitäisi varmaan kopioida tämä teksti oppaaksi.

Tietokoneesi monitori muodostaa näyttämänsä kuvan lukemalla värien arvot tietokoneen muistissa olevasta taulukosta, joka on yhtä suuri kuin on monitorissa pikseleitä. Esim. 1024x768 resoluutiolla taulukon koko on 1024x768. Jokainen taulukon solu vastaa siis yhtä pikseliä. Solussa oleva arvo kertoo monitorille pikselin värin, jonkin sopimuksen mukaan. Esim. arvo 0 voisi tarkoittaa mustaa ja arvo 16711680 punaista. Voidaksesi muuttaa monitorissa näkyvää kuvaa, sinun täytyy vain kirjoittaa tähän taulukoon uusia arvoja jolloin vastaavien pikselien värit muuttavat.

Näin kuitenkin vain teoriassa, sillä nykyisissä tietokoneissa on käynnissä yhtä aikaa useita ohjelmia. Jos jokainen ohjelma menisi omin nokkinensa käpelöimään tätä taulukkoa eli önäyttömuistiaö, olisi tuloksena pelkkää sekasotkua, kun jokainen ohjelma yrittäisi piirtää omaa kuvaansa samaan kohtaan näyttöä. Tämän takia tietokoneen käyttöjärjestelmä estää ohjelmia kirjoittamasta näyttömuistiin suoraan.

Sen sijaan käyttöjärjestelmä tarjoaa ohjelmalle rajapinnan eli joukon valmiita funktiota (proseduureja), joita käyttämällä ohjelman täytyy grafiikkansa piirtää. Näiden funktioiden avulla käyttöjärjestelmä ohjaa jokaisen ohjelman piirtämän grafiikan sille varattuun öikkunaksiö kutsuttuun alueeseen näytöllä. Näin päällekkäin piirtämistä ei tapahdu. Tällaisia rajapinnan tarjoamia funktiota voisiat olla esim. öluoIkkuna(koko)ö ja öpiirräPiste(sijainti, väri)ö. Windowsissa tämän rajapinnan nimi on öGDIö ja Linuxissa öXö.

Kuten huomasit, jokaisella käyttöjärjestelmällä on siis omat funktionsa grafiikan piirtämiseen. Tämä hankaloittaa asioita, jos halutaan ohjelma, joka toimii käyttöjärjestelmästä riippumatta. Ratkaisuna voidaan käyttää kolmannen osapuolen tarjoamaa rajapintaa, joka abstrahoi käyttöjärjestelmän grafiikkarajapinnan. Yksi tällainen rajapinta on SDL. Kun kutsut SDL:n öpiirräPisteö-funktiota se kutsuu puolestaan käyttöjärjestelmän öpiirräPisteö-funktiota. Näin käyttämäsi funktiot pysyvät samana oli alla sitten mikä käyttöjärjestelmä tahansa.

3D-grafiikka ei ole mitenkään erilaista kuin tavallinenkaan. Piirtääksesi 3D-kuvan sinun pitää vain asetella ikkunassa näkyvien pikselien värit niin, että kuva näyttää kolmiulotteiselta. Koska monitorin pinta on kaksiulotteinen taso, voi siihen piirretty kuva ainoastaan näyttää kolmiulotteiselta, ei koskaan olla aidosti sellainen. Kolmiulotteinen kappale piirretään yleensä approksimoimalla sitä monitahokkaalla. Monitahokas koostuu kärjistä eli vertekseistä ja tahoista jotka ovat monikulmioita. Koska jokainen monikulmio voidaan jakaa kolmioiksi, voidaan monitahokas piirtää, jos vain osataan piirtää kolmioita. Kolmiulotteinen syvyysvaikutelma saadaan aikaiseksi jakamalla jokaisen verteksin sijainti ikkunassa (x ja y koordinaatti) sen syvyyssuuntaisella etäisyydellä (z koordinaatti). Tällöin syntyy perspektiivivaikutelma.

Kolmion piirtäminen, niin yksinkertaiselta kun se saattaa kuulostaakin, tarvitsee yllättävän paljon laskentatekoa, varsinkin, jos kolmio halutaan vielä värittää esim. pinnoittamalla se jollakin kuvalla. Tähän takia nykyisissä näytönohjaimissa on kolmioiden piirtämiseen erikoistunut prosessori ns. grafiikkaprosessori GPU. Koska näytönohjainvalmistavat pitävät grafiikkaprosessorien spesifikaatiot salassa, ei näitä prosessoreja voida ohjelmoida suoraan. Sen sijaan näytönohjainten ajurit tarjoavat taas yhden rajapinnan, jonka kautta näitä näytönohjaimia käytetään. Yleisin tällainen rajapinta on OpenGL.

3D-grafiikan piirtäminen OpenGL avulla on varsin helppoa. Sinun täytyy vain antaa OpenGL:lle taulukko, joka sisältää kaikkien piirrettävien kolmioiden kärkipisteiden koordinaatit. Sitten vain kutsut piirrä-funktiota ja kaikki kolmiota piirtyvät ruudulle. Lisäksi tietenkin pitää antaa erilaisia asetuksia, kuten mahdollinen kuva, jolla kolmiota pinnoitetaan ja tieto siitä mistä suunnasta millaisella kameralla kolmioita katsotaan. OpenGL hoitaa sitten perspektiivivaikutelman luomisen ja muut asiat automaattisesti.

Ongelmaksi jää lähinnä tuottaa tämä näytönohjaimelle annettava data eli kolmiot jotka esittävät haluttua kappaletta. Tässä auttaa 3D-mallinnusohjelma. Näitä ohjelmia on valtavasti, mutta voisin suositella Blender nimistä ohjelmaa: öwww.blender.orgö. Sen (kuten kaikkien muidenkin edistyneiden 3D-mallinnusohjelmien) aloituskynnys on varsin korkea, mutta kun siitä pääsee jyvällä on se yksi parhaista ohjelmista.

Mainittakoon vielä lopuksi, että grafiikan piirtäminen ei ole kieli riippuvaista. Voidaksesi piirtää grafiikka tarvitset vain SDL ja OpenGL kirjastot omalle kielellesi ja pääset alkuun.

Blaze [09.11.2007 11:49:25]

#

Markus kirjoitti:

... pitäisi varmaan kopioida tämä teksti oppaaksi.

Ei hassumpi idea. Hyvää tekstiä.

Triton [09.11.2007 20:26:10]

#

No siis lähinnä minulle on nyt ongelma tuon SDL pascal unitin asentamisessa, eli miten ne tiedostot on käsiteltävä ja asetettava freepascaliin, niin ettei se valittaisi "can't unit"...

Blenderiä olen käyttänyt ennenkin ja sen käyttö ei ole ongelma, mutta halusin vain varmistuksen, että pelkällä OpenGL:kin saa 3D- grafiikkaa aikaan...

Metabolix [09.11.2007 20:33:02]

#

Kuten jo yllä yritin vihjata, ajat jokaiselle pp-tiedostolle käännöskomennon (minulla ainakin ppc386 tiedosto.pp), joka tuottaa .o- ja .ppu-tiedostot. Minulla kaikki toimi, kun pidin nämä SDL-ohjelman käännöshakemistossa, mutta siistimpää on tietenkin sijoittaa nämä kääntäjän kirjastokansioon. Lue paketin mukana tulevat ohjeet (INSTALL jne), niistä voi Windowsissakin saada vähän viitettä asioista.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta