Udostępnij za pośrednictwem


Tessellation (Direct3D 9)

Jednostka Tessellator

Jednostka tessellator została ulepszona. Teraz możesz go użyć do:

  • Wykonaj adaptacyjną tesselację wszystkich pierwotnych wyższego rzędu.
  • Wyszukaj wartości przesiedleń poszczególnych wierzchołków z mapy przemieszczenia i przekaż je do cieniowania wierzchołków.
  • Obsługa tessellacji prostokątnej poprawki. Jest to określane za pomocą deklaracji wierzchołka przy użyciu D3DDECLMETHOD_PARTIALU lub D3DDECLMETHOD_PARTIALV. Jeśli deklaracja wierzchołka zawierająca te metody jest używana do rysowania poprawki trójkąta, IDirect3DDevice9::D rawTriPatch zakończy się niepowodzeniem. Aby uzyskać więcej informacji na temat deklaracji wierzchołków, zobacz D3DVERTEXELEMENT9.

W directX 8.x, co było nazywane ORDER było naprawdę stopień. W trybie Direct3D 9 stopień jest teraz określony przez D3DDEGREETYPE.

 // 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; 

Zmiana typu stopnia dotyczyła dwóch innych struktur.

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; 

Sterowniki muszą naprawić błędy kompilacji, które będą wynikać z tej zmiany podczas kompilowania przy użyciu nowych nagłówków. Nie trzeba zmieniać funkcji.

Adaptacyjna tesselacja

Adaptacyjne tessellation można stosować do pierwotnych o wysokiej kolejności, w tym N-patches, poprawek prostokątnych i poprawek trójkątów. Ta funkcja jest włączona przez D3DRS_ENABLEADAPTIVETESSELLATION i adaptacyjnie tessellate poprawki na podstawie wartości głębokości wierzchołka sterującego w przestrzeni oczu.

Współrzędne z (Zi) wierzchołków kontrolnych (Vi), które są przekształcane w przestrzeń oczu (Zieye), wykonując produkt kropkowy z wektorem 4, są używane jako wartości głębokości. Wektor 4D (Mdm) jest określany przez aplikację przy użyciu czterech stanów renderowania (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z i D3DRS_ADAPTIVETESS_W). Ten wektor 4 może być trzecią kolumną połączonych światów i macierzy widokowych. Można go również użyć do zastosowania skali do Zieye.

Przyjmuje się, że funkcja obliczania poziomu tessellacji Ti z Zieye wynosi (MaxTessellationLevel/Zieye), co oznacza, że MaxTessellationLevel jest poziomem tessellacji na poziomie Z = 1 w przestrzeni oczu. Wartość MaxTessellationLevel jest równa wartości ustawionej przez IDirect3DDevice9::SetNPatchMode dla N-patches i dla poprawek RT jest równa pNumSegs. Poziom tessellacji jest następnie zaciśnięty do wartości, zdefiniowany przez dwa dodatkowe stany renderowania D3DRS_MINTESSELLATIONLEVEL i D3DRS_MAXTESSELLATIONLEVEL, które definiują minimalne i maksymalne poziomy tessellacji, które mają być zaciśnięte. Ti dla każdego wierzchołka wzdłuż krawędzi poprawki są uśrednione, aby uzyskać poziom tessellacji dla tej krawędzi. Algorytm obliczania ti dla prostokątnych poprawek, poprawek trójkątów i N-patches różni się w tym, jakie wierzchołki sterujące są używane do obliczania poziomu tessellacji.

W przypadku poprawek prostokątnych z linią B są używane cztery najbardziej zewnętrzne wierzchołki sterujące. Na przykład: z kolejnością D3DORDER_CUBIC: wierzchołki (1,1) i (1,width-2) są używane z pNumSegs[0], wierzchołki (1,width-2) i (height-2,height-2) są używane z pNumSegs[] 1], wierzchołki (height-2,width-2) i (1,width-2) są używane z wierzchołkami pNumSegs[2], a wierzchołki (2,1) i (1,1) są używane z elementami pNumSegs[3].

W przypadku poprawek trójkątów używane są wierzchołki wierzchołków z rogami. W przypadku D3DORDER_CUBIC kolejności: wierzchołki (0) i (9) są używane z wierzchołkami pNumSegs[0], wierzchołki (9) i (6) są używane z wierzchołkami pNumSegs[1], a wierzchołki (6) i (0) są używane z elementami pNumSegs[3].

W przypadku n-poprawek używane są wierzchołki trójkątów.

W przypadku prostokątów i trójkątów z bazą Bezier używane są wierzchołki kontrolki narożnej.

Kontrola szybkości wierzchołków na wierzchołki. Aplikacja może opcjonalnie podać pojedynczą dodatnią wartość zmiennoprzecinkową na wierzchołek, która może służyć do kontrolowania szybkości tessellacji. Jest on dostarczany przy użyciu D3DDECLUSAGE_TESSFACTOR, dla którego indeks użycia musi być 0, a typ danych wejściowych musi być D3DDECLTYPE_FLOAT1. Jest to mnożone do poziomu tessellacji wierzchołków.

Matematyka

Poziom tessellacji (Te) dla krawędzi e, reprezentowany przez dwa wierzchołki sterujące (Ve1, Ve2), jest obliczany, jak pokazano poniżej:

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 

Gdy D3DRS_ENABLEADAPTIVETESSELLATION jest true, trójkąty pierwotne (listy trójkątów, wentylatory, paski) są rysowane jako N-patches, IDirect3DDevice9::SetNPatchMode ma ustawioną wartość mniejszą niż 1.0.

Zmiany interfejsu API

Nowe stany renderowania:

 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 

A ich wartości domyślne:

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 

Nowe limity sprzętu:

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

potoku wierzchołka