search
t Php C%http%3Bwww.grilE
C Tag % Php F%search4%Dsearch%
8% Php B% Php D Sweetsexyteen Fwasearchk Tag u Tag g Tag 2 Php o
gp Php 3
% Sweetsexyteen F Tag 2 Php w Sweetsexyteen wsearchsha Www esearch2 Sweetsexyteen p Php rsearchosearchcsearchmh Www Sweetsexyteen sexy%20fuck%20pn
asearchSsearchet Tag e Php ytsearche Php Www Www h Www %C5%B7%C3%C0%CE%DE%C2%EB%D7%AA%CC%FB%C7%F8ssearchar
hsearchssearchasearchc Sweetsexyteen w searchh Www Php 1e Sweetsexyteen r Sweetsexyteen h Sweetsexyteen
sEz a téma a három dimenziós grafika alapjaihoz tartozik, ugyanis viszonylag könnyen tudunk részleteket megjeleníteni testeken komolyabb telejsítménycsökkenés nélkül. A textúrázás azt jelenti, hogy a megjelenítendő test felszínére egy képet rakunk, így például könnyen készíthetünk egy egyszerű kockából egy fakockának kinéző tárgyat anélkül, hogy túlságosan elbonyolítanánk a geometriáját.
Tudnunk kell, hogy a textűrázás egy sokkal komplexebb téma az itt leírtaknál, bár bizonyos dolgokra még későbbi cikkben visszatérünk.
Remélem többet nem kell írnom arról, mi is az a textúrázás, hiszen számítógépes játékokból már mindenki jól ismeri őket. Inkább beszéljünk mégegyszer a texturakoordinátákról! Alapvető esetben képzeljünk el egy síkot, és jelöljünk ki ezen egy origót. Ekkor rakjuk az origóba a textúra bal felső sarkát, majd minden irányban végtelen sokszor ismételjük meg a textúrát(ami nyilván egy kép)! Ekkor a síkon két bázisvektort mérhetünk fel: az egyik az origóból a kép jobb felső sarkába mutat, a másik az origóból a bal alsó sarokba. Ekkor már értelmeztük is a textúrakoordinátákat. Ekkor például a képen látható piros pont a (1.5,1.0) koordinátájú pont:
Mint látjuk, a kép tényleg ismétlődik minden irányban, most az origó ténylegesen is a kép bal felső sarka. Gondolom eddig nem bonyolúlt. Természetesen a DirectX támogatja azt is, hogy a síkban a textúrákat nem csupán megismétli, hanem egyes irányokban mindig a textúra tükörképét rakja, így például az első sor első eleme az igazi textúra, a második tükörkép, a harmadik megint igazi, stb.
Most már csak az a kérdés, hogy hogyan rendeljük hozzá ezt a két dimenziós testet egy három dimenziós testhez? Egyszerűen, csupán egy háromszög minden csúcsához, vertexéhez megmondjuk, hogy a textúratér melyik koordinátája tartozik. Ekkor a textúrát akármilyen pózban rárakhatjuk a háromszögre, a közbülső pontokra a megfelelő koordinátákat a DirectX kiszámolja. Ez így lehet, hogy bonyolúlt, de az első cikkben már néztünk rá példát, a programot variálva pedig majd megvilágosodik.
Akkor nézzük is a programozási részt! A textúrát mindenféle effekt nélkül fogjuk kifeszíteni, az effektekről majd később. Mindenekelőtt kell egy vertexformátum, ugyebár, mint mindig:
#define CUSTOM_VERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
Ez azt jelenti, hogy a vertexeink természetesen transzformálatlanok, és egyetlen textúrát akarunk rá kifeszíteni(nincs jelenleg multitextúrázás). Több textúra használatáról majd később. Ekkor kell egy ehhez szükséges vertexstruktúra:
struct CUSTOMVERTEX {};
, ahol ugye a textúra két textúratérbeli koordinátája van megadva. Ha több textúránk lenne, akkor még lenne ugyanannyi textúrakkordinátapár, ahány textúra. Ha nem adunk meg koordinátát, alapértelmezében mind a tu, mind a tv nulla, így az egész testre a textúra(azaz kép) első pixelje vetül, magyarul egyszínű lesz a test. Ekkor adjuk meg a négyzetünket, amire egyszer fogjuk a teljes textúrát, azaz képet kifeszíteni:
CUSTOMVERTEX
vertices[]=
{},
{},
{},
{},
};
Itt minden pixelhez megadtuk a hozzá tartozó textúra egy pontját a textúratérbeli koordinátákkal. Ez most jól láthatóan egyszer lesz kifeszítve(természetesen TRIANGLE_STRIP-et használunk). Ez teljesen olyan, mintha magát a képet jelenítenénk meg, de ezt ne gondoljuk így, hiszen egy testet jelenítünk meg(négyzetet), csak csupán nem szinezzük, hanem a test pontjait egy kép pontjai szerint szinezzük, és ez a kép a textúra. Ha a textúrakkoordinátákat nem a sima ismétléses textúratérben értjük, hanem például tükrözöttbe(erről írtam az előbb), akkor azt meg kell adnunk:
lpD3D_Device->SetSamplerState(0,D3DSAMP_ADDRESSU, D3DADDRESS_MIRROR);
Itt az első paraméter nulla, ezt most nem tárgyaljuk miért, egy későbbi cikkben majd kiderül, a második paraméter pedig azt jelenti, hogy a textúra u irányban, azaz vízszintesen tükrözve legyen(a harmadik paraméter jelenti a tükrözést). De mi most az alapbeállítást használjuk, azaz azt, hogy a textúratérben a textúra csupán ismétlődjön:
lpD3D_Device->SetSamplerState(0,D3DSAMP_ADDRESSU, D3DADDRESS_WRAP);
Ezt természetesen nem kell beállítani, mert ez az alapértelmezés. Mindkettőt meg lehet csinálni a v koordinátára is. Igaz, most mindegy, hogy tükrözünk, vagy nem, mert az első textúra úgyis simán lesz kirajzolva… További textúratérbeli beállítások az SDK-ban vannak leírva.
Következő lépésben kell egy textúra típus:
LPDIRECT3DTEXTURE9 lpD3D_Texture=NULL;
majd ebbe bele kell tölteni egy képet, amit textúrának szeretnénk használni:
D3DXCreateTextureFromFile(lpD3D_Device,"texture.bmp",&lpD3D_Texture);
Itt gondolom mindegyik paraméter egyértelmű, csupán azt írnám le, hogy nem csupán bmp kép tölthető be, hanem többek közt jpeg és targa képformátumok is. Az ismert formátumok ugyancsak az SDK dokumentációjában megtalálhatóak. Megjegyzem, hogy létezik egy D3DXCreateTextureFromFileEx(…) függvény is, ezzel sokkal több beállítással tudjuk betölteni a textúránkat, úgymint colorkey, stb.
Ha a textúraazonosítónk ezután NULL értékű lesz, akkor hiba történt a betöltésnél(pl. nem található a fájl).
Ezután már csak renderelésnél mielőtt kirajzoljuk a primitívet, be kell állítanunk az aktuális textúrát, amit minden DrawPrimitive(…)függvény rá fog feszíteni az általa kirajzolt primitívekre. Természetesen ha több primitívünk van, és mindegyik más más textúrát használ, akkor mindegyik kirajzolása után be kell állítanunk az aktuális textúrát. Ezt így tudjuk:
zWww Sweetsexyteen No Tag Php Sweet Sexy Teen Textúrázásf H f f Sweet Sexy Teen Teen Hardcore iWww Sweetsexyteen No Tag Php Sweet Sexy Teen Textúrázásx v Hardcore Crossfit