Lekcija 5: Učitavanje i mapiranje textura

 

DirectX može učitati sa diska bilo koju teksturu, te je zatim mapirati na bilo koji trodimenzionalni poligon. Ovo ne znači da možete samo nacrtati neku bitmapu sa diska na neki poligon, već možete jednu bitmapu crtati na više poligona koji mogu biti međusobno u različitim položajima. Ovo omogućuje stavljanje textura složenih modela sve u jednu datoteku. Najčešće se koristi tga format jer podržava alphu na samoj bitmapi. U ovoj lekciji obrađeno je samo jednostavno učitavanje i pridjeljivanje teksture plohi.

 

Par stvari je dodano u odnosu na prošlu lekciju. Prvo i osnovno je promjena fleksible vertex formata plohe čime je rečeno da ploha sada osim koordinata vertexa i boje koristi i transformirane koordinate teksture.

 

#define PLOHAFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)                         

 

Koordinate teksture pridjeljuju se pojednim vertexima, i linearnom interpolacijom DirectX ih crta na poligon. Za crtanje se brine D3DDevice, no mapiranje je problem programera (ili modelera koji radi u LightWave-u ili 3DStudiu). Mapiranje je izvedeno pridjeljivanjem koordinata teksture pojednim vertexima CPloha objekta:

 

       pVertices[0].x=0;                                                         

       pVertices[0].y=0;                                                         

       pVertices[0].z=.5;                                                        

       pVertices[0].u=number;                                                    

       pVertices[0].v=number;                                                    

       pVertices[0].color=color;                                                 

Pažljivo sa kreiranjem strukture za vertexe, redoslijed varijabla u CPlohaFVF je bitan, tj prvo dolaze koordinate, zatim boja, a tek na kraju koordinate teksture, dok kod definiranja PLOHAFVF redoslijed nije bitan, radi se o binarnom or pojedinih zastavica. Koji mora biti redoslijed ovisi o samom FlexibleVertexFormatu, i on je prikazan u DirectX specifikaciji.

 

U FVF formatu podataka, određene vrijednosti smiju biti izostavljene, ali moraju ići određenim redosljedom.

 

Mapa teksture prikazana je na slici:

Poželjno je da teksture budu kvadratnog oblika, veličine takve da odgovara potenciji broja 2. Takve teksture su npr 32x32, 64x64 itd. Sa ovakvim teksturama DirectX mnogo brže i bolje radi.

Učitavanje tekstura vrši se pomoću D3DXCreateTextureFromFile procedure koja će automatski stvoriti teksturu iz datoteke na disku. U programu ova tekstura se pamti za svaki CPloha objekt. Bez obzira na jednostavnost učitavanja, ova procedura se ne ponaša uvjek kako to želimo, te ako vam je potrebno više opcija koristite D3DXCreateTextureFromFileEx proceduru koja daje veću slobodu pri kreiranju tesksture.

Mapiranje tekstura može se vršiti na razne načine, isto kao i adresiranje same teksture koje može biti zrcaljeno, ponavljati se, itd. Ove opcije podešavaju se pomoću IDirect3DDevice9->SetTextureStageState i IDirect3DDevice9->SetSamplerState procedura, a za detalje pogledajte DirectX 9.0 refrencu.

Predefinirana vrijednost adresiranja teksture je ponavljanje, dakle ako nekom vertexu pridjelimo vrijednost veću od 1, tekstra će se ponavljati. Ovo je prikazao u lekciji, i broj ponavljanja unosi se kod kreiranja plohe kao opcionalni parametar. Također je moguće podesiti i filtere za bojanje tekstura, te njeno iscrtavanje ovisno o alpha vrijednosti pixela bitmape. Druga ploha je zelena zbog načina na koji se filtrira tekstura. Ovo ovisi o vrijednostima flagova koje smo podesili pozivom IDirect3DDevice9->SetTextureStageState procedure.

 

D3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );

//modulirana boja texture                                                             

D3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );           

//prvi argument boje je textura                                                  

D3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );           

//drugi argument boje je diffuse komponenta vertexa                              

D3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );

//onemogućeno je alpha blendanje texture                                     

 

Na ovaj način svaki pixel poligona ovisi o boji susjednog vertexa i boji pixela teksture. Tekstura će se ponašati u skladu sa svim geometrijskim transformacijama koje vršimo nad objektom na koji je tekstura podešena.

 

Podešavanje teksture obavlja se naredbom IDirect3DDevice9->SetTexure, i djeluje sve dok se ta ista naredba ne pozove sa NULL argumentom ili sa nekom drugom teksturom.

Svim objektima nakon poziva ove naredbe DirectX će pokušati pridjeliti teksturu.

 

       D3DDevice->SetTexture( 0, texture );                                      

Nakon ovoga slijedi renderiranje ploha kao i u prošlom primjeru.

 

Izgled pete aplikacije:

 

 

Skini source kod

 

Made by:Mll


Prev Next