Joskus aikoinaan luolalentelypelin (tyyliin wings, liero, molez) tekeminen oli niin simppeliä kun meillä oli koko ajan suora yhteys pikselidataan. Sittemmin 3d-korttien kanssa tämä tehdään tekstuurien kautta minkä päivittäminen on aivan toinen asia.
Jos nyt käytetään OpenGL:ää, niin käytännössä koko tekstuurin päivittäminen esim glTexImage avulla on liian hidasta. glTexSubImage2D on minulle suht tuntematon funktio mutten tiedä onko siitäkään tässä iloa. Joskus kokeilin kuvan jakamista ruutuihin joilla jokaisella oli oma teksturi; se toimi muttei nopeus vielä mitenkään huimaava ollut, eikä joka ruudun päivitys ollut reaaliaikaista.
Mutta nyt tuli opittua uusi asia joka on framebuffer. Käytännössä tarkoittaa hyvin yksinkertaista tekniikkaa jolla voi piirtää 2D tai 3D grafiikkaa suoraan tekstuuriin. Pystyisin pitämään omaa taulukkoa joka pikselille joka kertoo kunkin materiaalin ja kestopisteet (ts. alpha), ja käyttämään tekstuuria vain graafiseen osaan.
Tuossa mitään loogisia aukkoja tai parempaa tekniikkaa jota pystyisi käyttämään? En tunne pixel-shadereitä ollenkaan tässä vaiheessa. Toisekseen totesin tuon framebufferin toimivan Radeon 3200 kortilla joka on suht vanha.
Siis mitä? Lue vaikka tämä alkuun: http://nehe.gamedev.net/
Kiitos linkistä, mutta mun koko OpenGL ohjelmointi alkoi nehen esimerkeillä. Mitä tarkoitat? En löytänyt ainuttakaan esimerkkiä tekstuurien nopeasta pikselimanipuloinnista.
Mitä tarkalleen ottaen yrität saada aikaan tekstuurien pikselitason manipuloinnilla? Yleensähän 3d-kiihdytetyissä peleissä tekstuurit on staattisia.
Siis ideana on että pelikartta on tekstuuri, ei kasa polygoneja. Pelaajan törmäykset katsotaan pikseleistä ja ampuminen/räjähdykset aiheuttavat tuhoa pikselitasolla. Maailma ei siis ole staattinen vaan täysin dynaaminen. Voi sen toteuttaa muuttuvilla polygoneillakin mutta eikö tuo framebuffer ole siihen paljon tehokkaampi?
Hei,
Minullakin on luolastonlentely peli rakenteilla,
Tässä on vuoden 2007 esidemo - http://temp4322.dy.fi/caveflyer/launch.jnlp
Peli rakentuu AsiakasOhjelmaani - http://temp4322.dy.fi/AsiakasOhjelma_AWT.html
En suosittele lukemaan pixeleitä kun tarkistat törmäyksiä, tee suosiolla oma int [] jono maailman pixeleille josta tarkistat törmäyksiä, jos erillaisia törmäys objekteja on vähän, esim. kivi, talo, ohjuspatteri, voi riittää myös byte [] jono.
Olisiko tuo GLDrawPixels oikeampi ratkaisu, ja maailma grafiikka olisi int [] jonossa ja törmäys tarkistukset byte [] jonossa ?
Toimikos tuon GLDrawPixels kanssa glscale ja gltranslate vai oliko se ainoastaan suoraan glpintaan piirtämistä ?
Ymmärtääkseni GL kehittäjät ovat sanona että GL ei ole tarkoitettu pixeli tason peleille, vaan tuki on enemmänkin static textureille ?
Mainitsinkin ekassa viestissä että pidän erillistä taulukkoa törmäyksille, tekstuurista ei tarvitse lukea mitään.
Olen käsittänyt että glDrawPixels on äärimmäisen hidas operaatio. Juuri sen takia framebufferin suora piirto tekstuuriin (extensionin kautta) tulikin minulle yllätyksenä.
Esimerkiks tuolla siitä: http://www.songho.ca/opengl/gl_fbo.html
Menee vähän pitempään ennen kun tästä saa jotain toimivaa aikaan mutta framebuffer tekniikkaa voi vilkasta vaikka mun enginen demoista:
http://www.sendspace.com/file/0aiuss
Kun kerran on mahdollista piirtää pyörivä kuutio tekstuuriin ja käyttää sitä samaa tekstuuria itse kuution tekstuurina, sain aikaan ikuisesti kuution sivuilla jatkuvan pyörivien kuutioiden silmukan. Samalla tavalla kuution sijaan tekstuuriin voi piirtää yksinkertaisen ympyrän joka kuvaa räjähdyskoloa. Mutta se mitä haluaisin tehdä on piirtää se kolo filttereillä jotka poistavat väriä, eli olisi vaikka valkoinen ympyrä joka vähentää itsensä siitä. Jos tekstuuri on läpinäkyvä niin voi käyttää eri tahtiin liikkuvaa taustaa.
Framebuffer,
Myös mieleeni tuli tuo GLBITMAP, vai olikos se ihan noin, en omaa tieto taitoa siihenkään kunnolla, mutta, käsittääkseni GL puolesta tämä GLDRAWPIXEL ja GLBITMAP ovat tarkoitettu pixel tason piirtelyyn, eikä framebuffer, ainakin minun käyttämässäni Java LWJGL kera tuo kuvaamasi framebuffer toimi ei olisi mahdollista, liekö sitten C++ OpenGL huomattavan rikkaampi ominaisuuksiltaansa.
Uskoakseni tuo GLBITMAP on tarkoitettu tuollaiseen, liekö sen kanssa sitten toimii myös glscale ja gltranslate jotta sitten käyttö onnistuu tehokkaasti, mutta kuten mainitsin minun kokemukseni OpenGL puolesta on miltein vain tuo Java LWJGL.
Minua kiinnostaa nähdä mitä rakennat, laita tänne sivustolle linkkiä kunhan valmistuu..
Tuossa nyt on kuva työvaiheesta:
http://imageshack.us/photo/my-images/810/pixelsk.png/
Toistaseks aluksella voi lentää eikä mikään törmää. Luodit häviää itsestään ulkopuolella ja tekevät reikää liikkuessaan.
Luotien ja kolojen koordinaatit ei kaikilla kokeiluilla synkkaa, ja kun synkkaa niin reikää tulee vaan tietylle neliskulmaiselle alueelle tekstuuria joka saattaa vaihdella lennossa. En tiedä vielä ihan tarkkaan mikä piirtoaluetta tässä rajaa. Tekstuuri on 2048x2048... Pitää tuossa tehdä testejä skaalauksilla ja viewport jutuilla. Liekkö tämän virtuaalisen framebufferin piirto pitäis saada just näytön rajojen sisään. Omasta mielestäni kokeilin jo sitäkin mutta kattoo nyt.
Niin ja teen tuota siis Lazarus Freepascalilla, en C++.
edit: Nuo piirtoalueongelmat on nyt korjattu, sitten jos sais läpinäkyvyyden kikkailtua... Ja pienen testailun jälkeen voi ainakin sanoa että se kyllä maalaa koko kartan hetkessä ilman minkäänlaista fps-hävikkiä.
Ei voi enää muokata viestiä, no kuitenkin läpinäkyvyyskin toimii. Mulla oli ennestään koodi jolla vähentää väriä joka sattu toimimaan tässä. Eli kun piirrän valkean ympyrän (KORJAUS: musta ympyrä toimii paremmin) framebufferin kautta karttatekstuuriin niin se vähentää sen myös alpha-kanavasta, tuoden taustan esille.
glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT); glBlendFunc(GL_SRC_ALPHA, GL_ONE);
Ja kai se jollain LWJGL:lläkin toimii jos se on päivitetty riittävästi. Mun OpenGL header tukee versioon 4.1 asti. Sen ja grafiikkakortin pitää myös tukea ainakin tätä funktiota: glFramebufferTexture2DEXT(), tai glGet:llä se kai tarkottaa yleisemmin GL_EXT_framebuffer_object
Julkasin nyt pienen videon youtubessa kun sain efektejäkin aikaseks: http://www.youtube.com/watch?v=0BrFwCob8xI
En tiedä aionko jatkaa tuota peliks asti, mutta toistaseks ainakin toimii niinkuin halusinkin.
Demossa lukitsin fps:n 120 mutta jos jätän ainoaks lukoks sleep(1), niin fps pyörii välillä 800-1200. Testin aikana 1680x1050 resoluutio samalla kun ampumisnappi pohjassa pyörii ympyrää paikallaan. Jos jättää sleepin kokonaan pois niin alkaa näyttö inisemään kun fps menee yli 4000:n.
Mutta en bloggaile tämän enempää, saapi kysellä jos kiinnostaa. Halusin lähinnä tietää muitakin keinoja tämän tyylisen pelin toteuttamiseen kuin framebuffer object, ja samalla tuoda esille vaihtoehto joka todellakin toimii.
Lisäsin tuossa vesifysiikat. Liikkuva vesi käyttää "partikkeleita" jotka ei liiku vaan siirtää density arvoa 0..255 viereisilleen. Kun density menee täyteen niin se lukkituu, eli poistetaan ja väritetään sinisenä karttatekstuuriin.
Toiseks räjähdykset ei enää piirrä ympyrää tekstuurilla vaan GL_POINTS:eilla joka pikseli kerrallaan. Ei näytä olevan mitään hidastavaa vaikutusta piirtonopeuteen, mutta nyt törmäyskartta on täysin synkassa tekstuurin kanssa.
Niin ja törmäyskartta on nykyään yleispätevästi materiaalikartta.
Uusin video:
http://www.youtube.com/watch?v=cEKD4CNvexU
Pelimoottorina siis tuo: https://www.ohjelmointiputka.net/keskustelu/
Aihe on jo aika vanha, joten et voi enää vastata siihen.