Eli ajattelin kysyä, että miten valaistus voidaan tehdä? En ole toteuttamassa nyt mitään ammatti tason valaistusta, mutta halusin kysyä.
Toinen kysymys on.. liittyen valaistukseen. Miten voin tummentaa jotain kuvaa koodilla? Ilman, että tekisin yhdestä kuvasta kahta. Eli koodilla tummennettaisiin. Tekisin näin sen valaistuksen toistaiseksi, mutta en tiedä miten kuvaa voi tummentaa. Eli C++ ja SDL käytössä. Tarvitaanko OpenGL?
Ps. Lisäksi ongelma. Teen maailma generaattoria ja se tekee 16000x16000 pikselin maailman. Eli melkoisen iso. Peli vain pätkii. Miten tämä puskuri saadaan tehtyä ettei juttuja mitä ei näy piirretä ja muutenkin miten muistia saadaan kevennettyä reippaasti? kartan tiedot tallennetaan vectoreihin. Kartta koostuu 40x40 ruuduista ja jokaiseen tulee jokin kuva. (vesi, ruoho, hiekka) Eli vectoreita on 160 000.
Hmm, ehkä pystyisit hyödyntämään tekstuurin pakkausta, esim DDS tiedostomuotoa. Tietoon siitä onko yhdessä ruudussa vettä, ruohoa tai hiekkaa riittää pieni int luku: 0..2. Kuva[0] = vesi, kuva[1] = ruoho, kuva[2] = hiekka. Ja todellisuudessa ei kukaan käytä noin isoja tekstuureita, se syö niin paljon muistia ettei kannata.
Mutta jos päädyt käyttämään tilejä, niin saisit helposti aikaan vaikka maailman jonka pikselikoko on 1000000x1000000. Jos vain ymmärtäisit mitä kuvaindekseillä tarkoitetaan.
Jos nyt oikein ymmärsin, niin pelimaailmasi koostuu 40x40 pikselin kokoisista palikoista, ja pelimaailman koko on 400x400 ruutua (16000 / 40 = 400).
Ymmärsin myöskin niin, että olet nyt luomassa maailmasta yhtä törkeän isoa kuvatiedostoa, jossa on useamman kerran identtisiä ruutuja (vesi, hiekka, jne).
Fiksuinta tässä tapauksessa olisi luoda tilepohjainen systeemi, eli tallennat jokaisen erilaisen kuvan 40x40 pikselin kokoiseen tiedostoon, ja piirrät sitten samaa kuvaa useita kertoja. Tilemuodossa olevan pelin kenttä voisi olla vaikka seuraavanlainen tekstitiedosto:
1111111111111 1000000000001 1000222220001 1000000000001 1111111111111
Esimerkissä voisi vaikkapa ykköset olla seinää, nolla vettä ja kakkonen hiekkaa (jolloin muodostuu hienon hieno aidattu saari). Koodissa sitten luet tuon tiedoston ja piirrät aina asiaankuuluvan kuvan.
Näin kenttien grafiikan vaatima muistin määrä ja kiintolevyllä olevan datan määrä tippuu radikaalisti ja on suoraan suhteessa erilaisten elementtien määrään. Jos rakennat systeemin oikein, niin tilepohjainen pelikenttä voi olla minkä kokoinen tahansa vaikuttamatta suorituskykyyn.
En edes anna neuvoja 16000x16000 pikselin kokoisen textuurin piirtämiseen, koska siinä ei ole mitään järkeä.
Tuohon tummennusongelmaan on moniakin ratkaisuja. Quick and dirty ratkaisu on piirtää vaikkapa samankokoinen läpinäkyvä musta kuva tekstuurin päälle, alkuperäisen tekstuurin muokkaaminen jne. Google auttaa.
punppis kirjoitti:
Tuohon tummennusongelmaan on moniakin ratkaisuja. Quick and dirty ratkaisu on piirtää vaikkapa samankokoinen läpinäkyvä musta kuva tekstuurin päälle, alkuperäisen tekstuurin muokkaaminen jne. Google auttaa.
Alphakanavan avulla saa tälläisen yksinkertaisen feikki valaistuksen tehtyä parissa minuutissa.
Tuossa siis oikeastaan vain piirretty erikokoisia ympyröitä eri intensiteetillä alphakanavaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.