Megosztás a következőn keresztül:


Köbkörnyezet leképezése (Direct3D 9)

A köbkörnyezeti térképek – más néven kockatérképek – olyan mintázatok, amelyek az objektumot körülvevő jelenetet ábrázoló képadatokat tartalmaznak, mintha az objektum egy kocka közepén lennének. A köbkörnyezeti térkép minden egyes arca egy 90 fokos nézetmezőt fed le vízszintesen és függőlegesen, és kockatérképenként hat arc található. Az arcok tájolása az alábbi ábrán látható.

kocka illusztrációja a kockák arcára merőleges központi koordinátatengelyekkel

A kocka minden egyes arca merőleges az x/y, y/z vagy x/z síkra a világűrben. Az alábbi ábra bemutatja, hogyan felelnek meg az egyes síkok egy arcnak.

kocka felületeinek ábrázolása síkokról származó koordináta-vetületekkel

A köbkörnyezeti térképek textúraobjektumok sorozataként vannak implementálva. Az alkalmazások statikus képeket használhatnak a köbkörnyezet-leképezéshez, vagy megjeleníthetik a kockatérkép arcait dinamikus környezetleképezés végrehajtásához. Ehhez a technikához a kockatérkép-felületeknek érvényes render-cél felületeknek kell lenniük, amelyeket a D3DUSAGE_RENDERTARGET jelzőkészlettel hoztak létre.

A kockatérképek arcainak nem kell rendkívül részletes rendereléseket tartalmazniuk a környező jelenetről. A legtöbb esetben a környezettérképek görbe felületekre lesznek alkalmazva. Tekintettel a legtöbb alkalmazás által használt görbület mennyiségére, az eredményül kapott fényvisszaverő torzítás fölöslegessé teszi a részletes megjelenítést a környezeti térkép részletezése szempontjából, tekintve a memória és a renderelési többletterhelést.

Mipmap-olt kocka környezet térképek

A kockatérképeket lehet mipmapolni. Mipmapped kockatérkép létrehozásához állítsa a CreateCubeTexture metódus Levels paraméterét a kívánt szintek számára. Ezeknek a felületeknek a topográfiáját az alábbi ábrán látható módon képzelheti el.

egy mipmapped kockatérkép diagramja n mip szintjeivel

A mipmapped köbkörnyezeti térképeket létrehozó alkalmazások minden archoz hozzáférhetnek a GetCubeMapSurface metódus meghívásával. Először adja meg a megfelelő értéket a D3DCUBEMAP_FACES számba vett típusból, ahogyan az Köbös környezeti térképfelületek létrehozása (Direct3D 9)című cikkben is szerepel. Ezután válassza ki a lekérni kívánt szintet úgy, hogy a GetCubeMapSurface szintparamétert a kívánt mipmap szintre állítja. Ne feledje, hogy a 0 megfelel a legfelső szintű rendszerképnek.

A kocka környezeti térképek textúrakoordinátái

A köbkörnyezet térképét indexelő textúrakoordináták nem egyszerű u, v stíluskoordináták, ahogyan a szabványos textúrák alkalmazásakor használják. A köbkörnyezeti térképek valójában egyáltalán nem használnak textúrakoordinátát. A mintázatkoordináták halmaza helyett a köbkörnyezeti térképek 3D vektort igényelnek. Ügyeljen arra, hogy megfelelő csúcsformátumot adjon meg. Amellett, hogy meg kell adnia a rendszernek, hogy hány textúrakoordináta-készletet használ az alkalmazás, információt kell adnia arról, hogy hány elem található az egyes készletekben. A Direct3D erre a célra kínálja a makrók D3DFVF_TEXCOORDSIZEN készletét. Ezek a makrók egyetlen paramétert fogadnak el, amely azonosítja annak a textúrakoordináta-készletnek az indexét, amelyhez a méretet leírják. 3D vektor esetén a D3DFVF_TEXCOORDSIZE3 makró által létrehozott bitmintát kell tartalmaznia. Az alábbi példakód bemutatja a makró használatát.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

Bizonyos esetekben, például a diffúz fényleképezésnél a vektorhoz normál kameratér csúcsot kell használni. Más esetekben, például a spekuláris környezet leképezése, egy tükröződésvektort használ. Mivel az átalakított csúcspontok normáljai széles körben ismertek, az itt található információk egy tükröződési vektor kiszámítására összpontosítanak.

A tükröződésvektorok önálló számításához ismerni kell az egyes csúcsok pozícióját, valamint egy vektort a nézőponttól az adott csúcsig. A Direct3D automatikusan kiszámítja a geometria tükröződési vektorait. Ezzel a funkcióval memóriát takaríthat meg, mert nem kell a környezettérkép anyagmintáinak koordinátáit megadnia. Emellett csökkenti a sávszélességet, és T&L HAL-eszköz esetén jelentősen gyorsabb lehet, mint az alkalmazás által önállóan végezhető számítások. Ennek a funkciónak a használatához a köbkörnyezet-térképet tartalmazó textúraszakaszban állítsa be a D3DTSS_TEXCOORDINDEX textúraszakasz állapotát a D3DTEXTURESTAGESTATETYPE D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR tagja és a textúrakoordináta-készlet indexének kombinációjára. Bizonyos helyzetekben, mint például a diffúz fényleképezés, használhatja a D3DTEXTURESTAGESTATETYPED3DTSS_TCI_CAMERASPACENORMAL tagját, amely miatt a rendszer az átalakított, kamera-térben lévő csúcspont normálját használja a textúra címzési vektoraként. Az indexet csak a rendszer használja a textúra burkoló módjának meghatározásához.

Az alábbi példakód bemutatja, hogyan használják ezt az értéket.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Ha engedélyezi az automatikus textúrakoordináta-létrehozást, a rendszer két képlet egyikével számítja ki az egyes csúcspontok tükröződési vektorát. Ha a D3DRS_LOCALVIEWER renderelési állapot értéke TRUE , a következő képletet használja a rendszer.

tükröződési vektor képlete (r = 2(exn)n-e)

Az előző képletben az R a kiszámított visszaverődési vektor, az E a normalizált pozíció-szem vektor, az N pedig a kameratér csúcspontja.

Ha a D3DRS_LOCALVIEWER renderelési állapota a FALSE van beállítva, a rendszer a következő képletet használja.

tükröződési vektor képlete (r = 2nzn-i)

A képlet R és N elemei megegyeznek az előző képletével. Az NZ elem a csúcs normál világ-térbeli z komponense, én pedig a végtelen távoli nézőpont vektora (0,0,1). A rendszer mindkét képlet tükröződésvektorát használja a kockatérkép megfelelő arcának kiválasztásához és kezeléséhez.

Jegyzet

A legtöbb esetben az alkalmazásoknak engedélyeznie kell a csúcspontok normáljainak automatikus normalizálását. Ehhez állítsa a D3DRS_NORMALIZENORMALS TRUEértékre. Ha nem engedélyezi ezt a renderelési állapotot, a környezeti térkép megjelenése jelentősen eltér a várttól.

 

További információt az alábbi témakör tartalmaz.

környezeti leképezés