Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kysymyksiä tekstuureista (OpenGL)

Sivun loppuun

Tumpelo [27.10.2006 14:05:25]

#

Eli, minulla on tekeillä peliprojekti joka vaatii aika ison kasan tekstuureja, ja n. puolet niistä on hyvin isoja. Huomasin, että tekstuurien lataus vie paljon aikaa, joten ei ole järkeä ladata niitä vähitellen ohjelman aikana, koska siitä aiheutuu turhia odottamistaukoja. Tarkoitus olisi, että peli lataa kaikki tekstuurit kerralla ja se on sitten siinä. Ongelma on se, että tällöin näytönohjaimelta vaaditaan muistia ihan kivasti. Kuinka pystyn laskemaan paljonko jokin tekstuuri vie näytönohjaimen muistissa tilaa? Jos tekstuuri on esim 1024*1024, tai 512*512 tai vaikka 32*128..? Kuvien formaatin kovalevyllähän ei ilmeisesti pitäisi vaikuttaa mitenkään?

Toinen kysymys on, että säilyväthän ne tekstuurit varmasti siellä näytönohjaimen muistissa jos se ei mene täyteen? Ettei sieltä poistu mitään ennen kuin ohjelma suljetaan? Tähän vielä lisäkysymys, että kuinka OpenGL:llä voi manuaalisesti vapauttaa jonkun tekstuurin näytönohjaimen muistista?

Grey [27.10.2006 14:15:04]

#

Tumpelo kirjoitti:

Huomasin, että tekstuurien lataus vie paljon aikaa

Hm, kuullostaa siltä ettet ole kovinkaan optimaalisesti tehnyt tekstuurien latausta. Optimoi moista esim. lataamalla suurempia paloja tiedostosta, kuin että tavu kerrallaan, joka _on_ hidasta. Muut voivat selittää miksi sellainen on hidasta.

Mitä sitten tulee koon laskemiseen, noh, se on helppoa. Ensin kuvat mitat kerrotaan toisillaan ja sitten kerrotaan se tavumäärällä, mitä on niissä väribittihommeleissa. Eli jos kuva on 1024x1024x24, kerrot 1024x1024 ja sitten kerrot tuon kolmella. 24 bittiä kun on kolme tavua..

-Grey-

Tumpelo [27.10.2006 14:23:29]

#

SDL_Surface *TextureImage[1];
GLuint logo[2];

if ((TextureImage[0] = SDL_LoadBMP("Media/Graphics/General/SpeedomLogo.bmp")))
{
glGenTextures(1, &logo[0]);

glBindTexture(GL_TEXTURE_2D, logo[0]);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->w, TextureImage[0]->h, 0, GL_BGR, GL_UNSIGNED_BYTE, TextureImage[0]->pixels);
}

Noin hoidan tuon tekstuurien latauksen, mikä olisi sitten parempi keino?

Elikkä, jos on 1024*1024 kuva joka on 24 bittinen, se on ~3mt?

Blaze [27.10.2006 14:29:37]

#

Tumpelo kirjoitti:

Elikkä, jos on 1024*1024 kuva joka on 24 bittinen, se on ~3mt?

Kyllä.

Metabolix [27.10.2006 16:50:30]

#

Kaikki tekstuurit on syytä vapauttaa glDeleteTextures-funktiolla. Se toimii samoilla parametreilla kuin glGenTextures. Myös tuo lataamasi bittikartta pitää vapauttaa, SDL_FreeSurface.

Oletko aivan varma, että hidasta on juuri tekstuurin lataaminen? OpenGL:n käynnistyminen itsessään kestää usein hetken...

Tekstuurin lataamisessa voisin kuvitella suurimman rajoitteen olevan kovalevy. Pakatut kuvat ovat siltä kannalta mukavampia ladattavia, joten suosittelen glpng-kirjastoa, josta olen itse koonnut jotakin helpommin käytettävää.

Tumpelo [27.10.2006 17:00:47]

#

Metabolix kirjoitti:

Oletko aivan varma, että hidasta on juuri tekstuurin lataaminen? OpenGL:n käynnistyminen itsessään kestää usein hetken...

Tekstuurin lataamisessa voisin kuvitella suurimman rajoitteen olevan kovalevy. Pakatut kuvat ovat siltä kannalta mukavampia ladattavia, joten suosittelen glpng-kirjastoa, josta olen itse koonnut jotakin helpommin käytettävää.

Siihen tulokseen olen päätynyt, sillä aina siinä välissä ohjelmaa missä on tekstuurien latausta, tulee jopa sekunnin lataustauko.

Pitääpä kokeilla tuota png kirjastoa, SDL:llä ladattuna kuvien värit näkyy bmp:tä lukuunottamatta väärin.

Meitsi [27.10.2006 17:02:35]

#

Eivätkös nykynäytönohjaimet osaa pakata tekstuureja näytönohjaimen muistissa? Ja mipmapit vievät luultavasti myös lisätilaa...

EDIT:
Tämä voisi auttaa:
http://developer.nvidia.com/object/texture_compression_OpenGL.html

Zach [27.10.2006 20:01:57]

#

Tumpelo kirjoitti:

Pitääpä kokeilla tuota png kirjastoa, SDL:llä ladattuna kuvien värit näkyy bmp:tä lukuunottamatta väärin.

Windowsin bmp-formaatissa värien järjestys on nimenomaan tuo GL_BGR, käytitkö GL_RGB:tä muita formaatteja kokeillessa?

Tumpelo [27.10.2006 20:15:04]

#

Zach kirjoitti:

Tumpelo kirjoitti:

Pitääpä kokeilla tuota png kirjastoa, SDL:llä ladattuna kuvien värit näkyy bmp:tä lukuunottamatta väärin.

Windowsin bmp-formaatissa värien järjestys on nimenomaan tuo GL_BGR, käytitkö GL_RGB:tä muita formaatteja kokeillessa?

Enpä tietenkään, kiitos vinkistä!


Sivun alkuun

Vastaus

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

Tietoa sivustosta