AZ UVAtlas használata (Direct3D 9)
Jegyzet
Az UVAtlas eredetileg az elavult D3DX9 utilty könyvtárban lett szállítva. A legújabb verzió a(z) UV Atlas Command-Line eszköznél (uvatlas.exe)érhető el.
Számos megjelenítési és tartalomgenerálási technika megköveteli egy 2D jel (például textúra) egyedi, nem átfedésmentes térképét a hálóra. Ilyen technikák a következők:
- Normál-/elmozdulási leképezés
- Textúratérbeli PRT-szimulációk és fénytérképek
- Felületfestés
- Textúratér megvilágítás
Az egyedi UV-leképezés manuális létrehozása gyakran időigényes és fárasztó; ez különösen igaz, ha a bemeneti geometria összetett, és hatékony/alacsony torzítású textúra-tér kihasználtságra van szükség. Az alábbi ábrán egy példarács és annak megfelelő textúraatlasz látható.
Ez a példa egy hálót (a bal oldalon) és a megfelelő UV-tér normál térképet mutat (jobb oldalon). Figyelje meg, hogy a textúra-atlasz több adatcsoportot vagy -fürtöt tartalmaz; minden fürtöt diagramnak nevezünk, és a fenti példában a megjelenítések a háló egy részének normál adatait tartalmazzák.
A D3DX UVAtlas API-k automatikusan létrehoznak egy optimális, nem átfedésmentes textúraatlaszt. Az API-k olyan bemeneti paramétereket biztosítanak, amelyek lehetővé teszik a következőt:
- Minimalizálja a textúra nyúlását, torzítását és alulméretezését.
- Maximalizálja a textúra-tér csomagolási sűrűségét a memória hatékony használatához.
- Egyenletes mintavételezést biztosít a hálón, minimalizálva a mintavételezési gyakoriság megszakításait.
Az UVAtlas működése
Az UVAtlas API-k (lásd UVAtlas Functions) egy felület diagramokba particionálásával és a diagramok anyagminta-atlaszba való csomagolásával létrehoznak egy anyagminta-atlaszot. A D3DXUVAtlasPartition és D3DXUVAtlasPack használatával külön hajthatja végre ezeket a lépéseket; vagy használja a D3DXUVAtlasCreate egyetlen hívás particionálására, paraméterezésére és csomagolására.
- Mesh- particionálása és paraméterezése
- Az integrált metrika-tenzorok segítségével a paraméterezés szabályozása
- Felhasználó által megadott gyűrődések szomszédos adatainak használata
- Diagramok becsomagolása az Atlászba
Mesh particionálása és paraméterezése
Először a hálót diagramokra particionáltuk, majd minden diagramot a saját [0,1] UV-térbe paraméterezünk. A hengerek paraméterezhetők egy diagrammal; egy gömbnek viszont két diagramra van szüksége, ahogyan az az alábbi ábrán is látható.
Az egyetlen diagrammal paraméterezhető hálót a rendszer "homeomorfikus lemeznek" minősíti, ami azt jelenti, hogy egy végtelenül rugalmas, végtelenül nyúló lemezt oszthat szét a diagramon, és tökéletesen lefedheti a geometriát. Ez a nyúlás, az úgynevezett homeomorfizmus, egy kétirányú függvény; ami azt jelenti, hogy az egyik paraméterezésről a másikra válthat anélkül, hogy elveszítené az információkat.
Nagyon kevés valós háló paraméterezhető két dimenzióba anélkül, hogy a hálót fürtökre vagy diagramokra kellene szétválasztani. Az alábbi ábra egy másik mintahálót és annak megfelelő anyagmintázatát mutatja be.
A létrehozott diagramok számát két paraméter határozza meg:
- Az atlaszhoz engedélyezett diagramok maximális száma
- Az egyes diagramok maximálisan megengedett nyúlása
A nyújtás mennyisége határozza meg a létrehozott diagramok számát és a mintavételezés általános minőségét. A nyújtás 0,0-tól 1,0-ig (bármilyen mértékű nyújtás) terjed. A D3DXUVAtlasCreate és a D3DXUVAtlasPartition visszaadja az algoritmus által létrehozott maximális nyúlást. Az alábbi ábra egy másik mintahálót és annak megfelelő anyagmintázatát mutatja be.
Integrálható metrika-tenzorok használata a paraméterezés szabályozásához
A textúra-tér rangsorolása háromszögenként adható meg. Az integrált metrika-tenzorok segítségével szabályozható, hogy a háromszögek hogyan legyenek feszítve az eredményül kapott textúra-tér atlaszban. Az IMT-ek közvetlenül vagy egy bemeneti jel alapján, a D3DX IMT számítási függvények használatával határozhatók meg. Az integrált metrika-tenzor (vagy IMT) egy szimmetrikus, 2x2-es mátrix, amely leírja, hogyan nyúlik meg egy háromszög az atlaszon. Az egyes IMT-eket 3 lebegőpontos szám határozza meg, nevezzük őket (a,b,c). Ezek egy szimmetrikus 2x2 mátrixba rendezhetők, mint a következő:
a b
b c
Ezután az IMT segítségével megtalálhatja a két vektor közötti távolságot. Adott két vektor v1 és v2, ahol:
vector v1
vector v2 = v1 + (s,t)
A v1 és a v2 közötti távolság a következőképpen számítható ki:
sqrt((s, t) * M * (s, t)^T)
Más szóval a vektor (s,t) az u-v térben tetszőleges irányban megadott nyújtás nagysága lehet. Ebben az esetben az s vektor az elsőtől a második csúcsig tartó irány, a t pedig a normál és az s keresztterméke. Például:
(1,1) * (1,1) = (2,2)
(1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
(1,1)
IMT(2,0,2) scales by 2 with no shearing
Az IMT-ek közvetlenül vagy egy bemeneti jel alapján határozhatók meg a D3DX IMT számítási függvények használatával: D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal és D3DXComputeIMTFromTexture_graphics.
Adja meg közvetlenül az IMT-adatokat, ha szeretné szabályozni, hogy a textúra-tér hogyan legyen lefoglalva az egyes háromszögekhez. Ezzel több területet oszthat ki az atlaszban a háló fontos területeire (például egy karakter arcára vagy mellkasi emblémájára, vagy egy jelenet régióira a játékos sétaútvonala közelében). Az identitásmátrix többszöröseit tartalmazó IMT-ek megadásával az eredményül kapott háromszögek egységesen lesznek skálázva a textúratérben.
Ha például nagy felbontású normál térképet használ, az IMT-t úgy is kiszámíthatja, hogy a normál térképen több anyagminta-helyet biztosítson a nagyobb gyakoriságú jel területeinek. A "sima" háromszögek (amelyek az eredeti normál térkép állandó régióira vannak leképezve) kevesebb anyagterületet kapnak. A nagy mennyiségű normál térképrészletet tartalmazó háromszögek a végeredményben több textúraterületet kapnak. Ezt követően a normál térképet egy kisebb textúrába leskálázhatja, miközben megőrizheti a részleteket, vagy újraszámíthatja a normál térképet az optimálisabb UV-leképezéssel.
Szomszédsági adatok használata a felhasználó által megadott gyűrődésekhez
A felhasználó által definiált szomszédos információk a particionálási függvény számára a hálóban előre definiált gyűrődések leírására szolgálnak, és így a szomszédos arcok közötti diagramhatárt határozzák meg. Ez egy egyszerű módja annak, hogy a felhasználó saját diagramparticionálást adjon meg az algoritmus bemeneteként, amely tovább finomítja a diagramokat, hogy a nyúlás a megengedett maximális érték alá kerüljön.
Példa
Ez a példa bemutatja, hogyan használhatja az UVAtlas API-kat és a DirectX Viewert (Dxviewer.exe) a modell olyan megszakításainak megkereséséhez és javításához, amelyek jelentősen befolyásolhatják a textúraatlasz méretét. A Dxviewer.exe a DirectX SDK-ból szerezheti be és ismerheti meg. Dxviewer.exe a 2009. augusztusi verzió után eltávolították a DirectX SDK-ból, így legalább a 2009. augusztusi DirectX SDK-ra lesz szüksége. További információ a DirectX SDK-ról: Hol található a DirectX SDK?.
Tegyük fel, hogy a kedvenc tartalomgeneráló szoftverében kezdett el használni néhány modellt (ez a példa egy Mayában létrehozott törpe fejmodellt használ). Exportálja a textúramodellt egy .x fájlba, és hozzon létre egy textúraatlaszt a D3DXUVAtlasCreate használatával. Az eredményként kapott anyagminta-atlasz az alábbi ábrához hasonlóan fog kinézni.
Az atlasz 22 térképet tartalmaz, és legnagyobb nyúlása 0,994.
Most tekintse meg a textúramodellt, hogy lássa, milyen jól megfelel a geometriának a textúra atlasza. Ehhez töltse be a modellt a megtekintő eszközbe:
- Nyissa meg a megtekintő eszközt a DirectX segédprogramokból.
- A Megnyitás gombra kattintva töltse be az .x fájlt.
- A gyűrődés megtekintési lehetőségének engedélyezéséhez kattintson a nézet gombra, és válassza a Gyűrések lehetőséget az előugró ablakból.
Az alábbi ábrán látható, hogy mit kell látnia a megtekintő eszközben.
Minden vonal egy gyűrődés, amely a textúra atlasz két diagramja közötti szomszédos él. Az algoritmus által létrehozott diagramok számát kisebb eltérések okozzák, talán a normálértékek megszakításai miatt. Ezek a kis különbségek csökkenthetők az adatok hegesztésével, vagyis a közel egyenlő adatok kényszerítésével. A normál és a bőrvastagságok hegesztéséhez:
- Futtassa a DirectX Ops (dxops.exe) eszközt a hálón az alábbi parancssorral (a "modelName.x" helyére írja be a modell nevét):
Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01; save 'newModelName.x';"
Ez összehasonlítja a normál értékeket és a bőrsúlyokat, és ahol 2,01-nél kisebb értékkel térnek el egymástól, az adatok egyenlővé lesznek. Az alábbi ábrák a szem közelképét mutatják, hogy láthatóvá váljanak a gyűrődések a hegesztés előtt (a bal oldalon) és a gyűrődések a hegesztés után (a jobb oldalon):
7. ábra: A gyűrődések eltávolítása hegesztéssel
Ebben a példában a hegesztés 86 csúcspontot távolított el a bemeneti hálóból. Ha kevesebb gyűrődés van a hálóban, az atlasz újragenerálható, ahogy az alábbi ábrán is látható.
Az atlasznak csak 7 diagramja van, és maximális kiterjedése körülbelül 0,0776. Az új atlasz most egy kisebb textúrába illeszkedik (ebben a példában körülbelül 30 egységnyivel kisebb%).
Diagramok csomagolása atlaszba
Miután egy hálót külön-paraméteres diagramokra particionáltak, a diagramokat hatékonyan kell egyetlen anyagminta-térképbe csomagolni. Ez a D3DXUVAtlasCreate második lépéseként történik, vagy kifejezetten meghívható a D3DXUVAtlasPack meghívásával.
A sűrűn elhelyezett diagramokat a felhasználó által meghatározott köz szélessége választja el egymástól. A vályúszélesség a grafikonok közötti távolság, és lehetővé teszi a bilineáris interpolációt és mip-leképezést, hogy elkerüljük a renderelési hibákat a grafikonok határainál. A D3DX felületet biztosít az ereszcsatornák automatikus kitöltéséhez – további információért lásd ID3DXTextureGutterHelper.
Az UVAtlas integrálása a munkafolyamatba
Amellett, hogy a textúrafestés előtt a művész által használtak, ezek a függvények integrálhatók egy automatizált művészeti rendszerbe. Egy UVAtlas-hívás például automatikusan kibocsátható egy objektum frissítése után, prT-szimuláció vagy normál leképezési bérlet végrehajtása előtt. Így nem kell manuálisan javítani az objektum UV-leképezését, ha a háló topológiáját módosították.
Lásd például az UV Atlas Command-Line eszköz (uvatlas.exe) használatát az UVAtlas függvényeknél.
Kapcsolódó témakörök