Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: SDL2: Monta tekstuuria yhdestä kuvasta

DumTom [29.10.2013 02:14:06]

#

Kaivelin yhen vanhan tekeleen jäistä ja rupesin työstämään sitä valmiiksi.
Jos mulla on iso png kuva niin kuinka voin irrotella siitä 64x64 pixeliä kokoisia paloja omiksi tekstuureiksi?
Peli ei vaadi tehoa joten teen sen nyt blittisysteemillä mutta tekstuurihomma olis kiva tietää sillä taidan lisätä erikoistehosteen tiettyyn tilanteeseen jolloin palan pitää pyöriä.

Lisäys:

En osannut blitata mitään.
Yritin ottaa suuresta kuvasta pienen palan mutta homma meni niin että piirsi suuren kuvan pienenä eikä ottanut palaa suuresta kuvasta.

User137 [30.10.2013 13:14:06]

#

Kai sillä pystyy piirtämään pienen palan siitä isosta kuvasta suoraan näyttöpuskuriin. Ei tarvitse sillon huolehtia pienistä "tekstuureista" jos niitä voi SDL:ssä siksi kutsua.

http://wiki.libsdl.org/SDL_BlitSurface
Toinen parametri tuossa on se pieni neliö ison kuvan sisällä (src/source eli lähde, ja vastaavasti dst/destination on kohde mihin piirretään).

Metabolix [30.10.2013 13:30:56]

#

Sinun pitää luoda uusi 64x64 pikselin pinta ja kopioida sille oikea pala. Voit käyttää samaa pintaa kaikkien tekstuurien luomiseen. Muista lopuksi tuhota pinta.

Tarinastasi päätellen olet käyttänyt väärää funktiota (ehkä SDL_BlitScaled) ja antanut sille väärän parametrin (ehkä kohdealueen koon). Alueen kopiointiin voit käyttää funktiota SDL_BlitSurface, jonka toinen parametri on kopioitava alue. Funktio on itse asiassa ihan samanlainen kuin vanhassa SDL:ssä, joten kai nyt osaat sitä käyttää? Jos käytät läpinäkyvyyttä, aseta alkuperäiselle pinnalle SDL_BLENDMODE_NONE, jotta myös alfakanava kopioidaan.

Yksi mahdollisuus on myös pilkkoa suuri kuva jo valmiiksi eri tiedostoihin.

User137, kannattaisi ehkä lukea vähän, mikä se SDL2 edes on. Enää ei piirrellä näyttöpuskuriin, vaan nykyään todellakin käytetään tekstuureita.

User137 [01.11.2013 05:14:10]

#

Juu, olen kuullut että SDL viimeisimmät versiot tukee jossain määrin myös grafiikkakorttia. Käytännössä videokortin paras ratkaisu on käyttää suuria tekstuureita joista renderöidä näitä pieniä paloja. Parhaimmat pelimoottorit menee niin pitkälle että yhdistelee olemassaolevie tekstuureja, ns. texture-atlas-tekniikalla. Jatkuva tekstuurin vaihtaminen syö tehoa todella paljon. Varsinkin jos tässä on kaikki palat 64x64, olisi äärimmäisen helppoa piirtää kaikki siitä samasta.

Tzaeru [01.11.2013 09:00:23]

#

SDL 2:ssa SDL_Surfacet säilötään keskusmuistissa ja niitä käsitellään CPU:lla. Eli minkäänlaista hyötyä näytönohjaimesta ei tällöin saada. Jos haluaa rautakiihdytettyä (uuh) renderöintiä, SDL_Texture olisi silloin oikea ratkaisu. SDL_Texture siirtää tekstuurit näytönohjaimen muistiin ja tekstuurin renderöintiin käytetään puhtaasti näytönohjainta.

Joka tapauksessa, SDL_BlitSurface (sdl_surfaceille) ja SDL_RenderCopy (sdl_textureille) ovat jossain määrin samankaltaisia funktioita, eli:

int SDL_BlitSurface(SDL_Surface*    src,
                    const SDL_Rect* srcrect,
                    SDL_Surface*    dst,
                    SDL_Rect*       dstrect)


int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect)

srcrectin pitäisi toki olla sellainen, että sen jäsenet x ja y kertovat kohdan, josta aloittaa kopiointi. Jäsenet w ja h taas kertovat kopioitavan alueen leveyden ja korkeuden, eivät suinkaan suoraan sitä kohtaa, johon asti halutaan kopioida.

Ja dstrectin kohdalla x ja y kertovat toki kohdan, johon aloittaa kopiointi ja w ja h kohdealueen leveyden ja korkeuden.

Metabolix [01.11.2013 18:14:52]

#

Tzaeru: Hieno juttu, mutta ei kai kukaan ole edes ehdottanut, että blittausta käytettäisiin renderöintiin? Ymmärtääkseni se ei ole edes mahdollista SDL2:ssa. Kysyttiin vain, miten saa pilkottua yhden kuvan moneksi tekstuuriksi, ja siihen blittaus on minusta ihan hyvä ratkaisu. Tietenkin User137:n vaihtoehto eli yhden tekstuurin käyttö on asia erikseen.

Tzaeru [03.11.2013 09:59:51]

#

Lähinnä esitin tuon vaihtoehtoisena tapana blittaukselle, kun kuvasta halutaan renderöidä tietty osa. Yleensä ei kuitenkaan välttämättä halua montaa tekstuuria/surfacea jos vähempi riittää.

SDL_RenderCopyEx:llä saa renderöityä sen osan rotaation kanssa, jos sitten haluaa myös pyöritellä palaa.

Vastaus

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

Tietoa sivustosta