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
Kapcsolódó témakörök