Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Aloittelijan Valoistus.

mika132 [26.04.2012 13:37:24]

#

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.

User137 [26.04.2012 16:13:57]

#

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.

punppis [29.04.2012 09:00:06]

#

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.

jalski [29.04.2012 11:08:38]

#

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.

Vastaus

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

Tietoa sivustosta