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!
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;
Oon nyt ihan jäässä eli mitä tarkotat tiedostojen kääntelyllä? :D
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 ...
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.
Markus kirjoitti:
... pitäisi varmaan kopioida tämä teksti oppaaksi.
Ei hassumpi idea. Hyvää tekstiä.
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...
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.