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


Tessellation (Direct3D 9)

Tessellator egység

A tessellator egységet továbbfejlesztettük. Mostantól a következőre használhatja:

  • Az összes magasabb rendű primitív adaptív tessellációjának végrehajtása.
  • Keresse meg a csúcsonkénti eltolódási értékeket egy elmozdulási térképről, és adja át őket egy csúcspont-árnyékolónak.
  • Téglalap-patch tessellation támogatása. Ezt csúcs deklarációval adhatók meg D3DDECLMETHOD_PARTIALU vagy D3DDECLMETHOD_PARTIALV használatával. Ha az alábbi módszereket tartalmazó csúcspontdeklarációt használ egy háromszögfolt rajzolásához, az IDirect3DDevice9::D rawTriPatch sikertelen lesz. További információ a csúcspontok deklarációiról: D3DVERTEXELEMENT9.

A DirectX 8.x-ben valójában az ORDER volt a fok. A Direct3D 9-ben a fokot a D3DDEGREETYPEadja meg.

 // This used to be D3DORDERTYPE and D3DORDER* 
 typedef enum _D3DDEGREETYPE 
 { 
 D3DDEGREE_LINEAR = 1, 
 D3DDEGREE_QUADRATIC = 2, 
 D3DDEGREE_CUBIC = 3, 
 D3DDEGREE_QUINTIC = 5, 
 D3DDEGREE_FORCE_DWORD = 0x7fffffff, 
 } D3DDEGREETYPE; 

A foktípus változása két másik struktúrát is érintett.

typedef struct _D3DRECTPATCH_INFO 
 { 
 UINT StartVertexOffsetWidth; 
 UINT StartVertexOffsetHeight; 
 UINT Width; 
 UINT Height; 
 UINT Stride; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DRECTPATCH_INFO; 
 typedef struct _D3DTRIPATCH_INFO 
 { 
 UINT StartVertexOffset; 
 UINT NumVertices; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DTRIPATCH_INFO; 

Az illesztőprogramoknak ki kell javítaniuk a módosításból eredő fordítási hibákat, amikor az új fejlécekkel állnak össze. A funkciókat nem kell módosítani.

Adaptív Tessellation

Adaptív tesselláció alkalmazható a nagy rendű primitívek, beleértve az N-patches, téglalap javítások, és háromszög javítások. Ezt a funkciót a D3DRS_ENABLEADAPTIVETESSELLATION engedélyezi, és adaptív módon tessellates egy javítást a szemtér vezérlő csúcsának mélységi értéke alapján.

A mélységértékekként a vezérlő csúcsok (Vi) z koordinátáit (Zi) használják, amelyek szemtérvé (Zieye) alakulnak át egy pont szorzat 4 vektorral történő végrehajtásával. A 4D vektort (Mdm) az alkalmazás négy renderelési állapottal (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z és D3DRS_ADAPTIVETESS_W) adja meg. Ez a 4 vektor lehet az összefűzött világ harmadik oszlopa, és mátrixokat tekinthet meg. A skálát a Zieye-ra is alkalmazhatja.

A Zieye-ből származó Ti tessellációs szint kiszámításának függvénye (MaxTessellationLevel/Zieye), ami azt jelenti, hogy a MaxTessellationLevel a Z = 1 tessellációs szint a szemtérben. A MaxTessellationLevel értéke megegyezik az IDirect3DDevice9::SetNPatchMode által beállított értékkel az N-javítások esetében, az RT-javítások esetében pedig a pNumSegs értékekkel. A tessellációs szintet ezután a két további renderelési állapot D3DRS_MINTESSELLATIONLEVEL és D3DRS_MAXTESSELLATIONLEVEL határozza meg, amelyek meghatározzák a rögzítendő minimális és maximális tessellációs szinteket. A javítások széle mentén lévő egyes csúcsok Ti-jét átlagolva kapjuk meg az adott él tessellációs szintjét. A ti négyszög-javítások, háromszögfoltok és N-javítások számítási algoritmusa eltér az tessellációs szint kiszámításához használt vezérlő csúcspontoktól.

A B-spline alapot tartalmazó téglalapfoltok esetében a négy legkülső vezérlő csúcsot használják. Például D3DORDER_CUBIC sorrendben: csúcspontok (1,1) és (1,width-2) a pNumSegs[0], a csúcsokat (1,width-2) és (height-2,height-2) a pNumSegs[1], a csúcsokat (height-2,width-2) és (1,width-2) a pNumSegs[2] és a csúcspontokat (2,1) és (1,1) a pNumSegs[3] használja.

A háromszögfoltok esetében a sarokfolt csúcsai használatosak. D3DORDER_CUBIC sorrendben: a csúcsokat (0) és (9) a pNumSegs[0], a csúcspontokat (9) és a (6) a pNumSegs[1] és a csúcsokat (6) és (0) pNumSegs[3] használják.

Az N-patchek esetében a háromszög csúcspontjai használatosak.

A bezier alapokkal rendelkező téglalap- és háromszögfoltok esetében a sarokvezérlő csúcsokat használja a rendszer.

Csúcsonkénti tessellációs sebesség szabályozása. Az alkalmazások opcionálisan egyetlen pozitív lebegőpontos értéket adhatnak meg csúcsonként, amely a tesselláció sebességének szabályozására használható. Ezt a D3DDECLUSAGE_TESSFACTOR adja meg, amelyhez a használati indexnek 0-nak kell lennie, a bemeneti típusnak pedig D3DDECLTYPE_FLOAT1 kell lennie. Ez a csúcsonkénti tessellációs szintre van megszorozva.

Matek

Az e él tessellációs szintje (Te) két vezérlő csúcsponttal (Ve1, Ve2) van kiszámítva az alábbiak szerint:

Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). 
Ze1eye = Ve1 . Mdm 
Ze2eye = Ve2 . Mdm 
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye 
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye 
Te = ( Te1 + Te2 ) / 2; 
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL 
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL 

Ha D3DRS_ENABLEADAPTIVETESSELLATION igaz , a háromszögprimitívek (háromszöglisták, ventilátorok, sávok) N-javításként lesznek rajzolva, IDirect3DDevice9::SetNPatchMode értéke 1,0-nál kisebb.

API-módosítások

Új renderelési állapotok:

 D3DRS_ENABLEADAPTIVETESSELLATION // BOOL 
 D3DRS_MAXTESSELLATIONLEVEL       // Float 
 D3DRS_MINTESSELLATIONLEVEL       // Float 
 D3DRS_ADAPTIVETESS_X             // Float 
 D3DRS_ADAPTIVETESS_Y             // Float 
 D3DRS_ADAPTIVETESS_Z             // Float 
 D3DRS_ADAPTIVETESS_W             // Float 
 
 // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL 
 // cannot be less than 1 

És az alapértelmezett értékek:

D3DRS_MAXTESSELLATIONLEVEL = 1.0f 
D3DRS_MINTESSELLATIONLEVEL = 1.0f 
D3DRS_ADAPTIVETESS_X = 0.0f 
D3DRS_ADAPTIVETESS_Y = 0.0f 
D3DRS_ADAPTIVETESS_Z = 1.0f 
D3DRS_ADAPTIVETESS_W = 0.0f 
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE 

Új hardverkorlátok:

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

Csúcsfolyamat