Udostępnij za pośrednictwem


Stałe kody FVF funkcji (Direct3D 9)

Kod FVF opisuje zawartość wierzchołków przechowywanych przeplatane w jednym strumieniu danych. Zazwyczaj określa dane, które mają być przetwarzane przez potok przetwarzania wierzchołków funkcji stałych. Jest to deklaracja wierzchołka starszego stylu; aby wyświetlić bieżący styl deklaracji wierzchołka, zobacz D3DVERTEXELEMENT9.

Aplikacje Direct3D mogą definiować wierzchołki modelu na kilka różnych sposobów. Obsługa elastycznych definicji wierzchołków, znanych również jako elastyczne formaty wierzchołków lub elastycznych kodów formatu wierzchołków, umożliwia aplikacji używanie tylko potrzebnych składników wierzchołków, eliminując te składniki, które nie są używane. Używając tylko wymaganych składników wierzchołków, aplikacja może zaoszczędzić pamięć i zminimalizować przepustowość przetwarzania wymaganą do renderowania modeli. Opisano sposób formatowania wierzchołków przy użyciu kombinacji kodów D3DFVF.

Specyfikacja FVF zawiera formaty rozmiaru punktu określone przez D3DFVF_PSIZE. Ten rozmiar jest wyrażony w jednostkach przestrzeni aparatów dla nie transformowanych i oświetlonych wierzchołków (TL) oraz w jednostkach przestrzeni urządzenia dla wierzchołków TL.

Metody renderowania interfejsu IDirect3DDevice9 zapewniają aplikacjom języka C++ metody, które akceptują kombinację tych flag i używają ich do określania sposobu renderowania elementów pierwotnych. Zasadniczo te flagi informują system, które składniki wierzchołka — położenie, wierzchołki mieszające wagi, normalne, kolory oraz liczbę i format współrzędnych tekstury — aplikacja używa i pośrednio, które części potoku renderowania mają być stosowane w usłudze Direct3D. Ponadto obecność lub brak określonej flagi formatu wierzchołka komunikuje się z systemem, które pola składników wierzchołka znajdują się w pamięci i które pominięto.

Aby określić ograniczenia urządzeń, możesz wysłać zapytanie do urządzenia o wartości D3DFVFCAPS_DONOTSTRIPELEMENTS i D3DFVFCAPS_TEXCOORDCOUNTMASK w elemencie członkowskim FVFCaps D3DCAPS9.

Współrzędne tekstury można zadeklarować w różnych formatach, dzięki czemu tekstury mogą być rozwiązywane przy użyciu co najmniej jednej współrzędnej lub nawet czterech współrzędnych tekstury (dla współrzędnych tekstury rzutowanej 2D). Aby uzyskać więcej informacji, zobacz Formaty współrzędnych tekstury (Direct3D 9). Użyj zestawu D3DFVF_TEXCOORDSIZEN makr, aby utworzyć wzorce bitów identyfikujące formaty współrzędnych tekstury używane przez format wierzchołka.

Żadna aplikacja nie będzie używać każdego składnika. Wzajemne jednorodne pola W (RHW) i wierzchołka normalne są wzajemnie wykluczające się. Większość aplikacji nie będzie też próbowała używać wszystkich ośmiu zestawów współrzędnych tekstury, ale direct3D ma tę pojemność. Istnieje kilka ograniczeń dotyczących flag, których można używać z innymi flagami. Na przykład nie można używać flag D3DFVF_XYZ i D3DFVF_XYZRHW, ponieważ oznacza to, że aplikacja opisuje położenie wierzchołka zarówno z nieprzetłumaczoną, jak i przekształconą wierzchołkami.

Aby użyć indeksowanego łączenia wierzchołków, flaga D3DFVF_LASTBETA_UBYTE4 powinna pojawić się na końcu deklaracji FVF. Obecność tej flagi wskazuje, że piąta waga mieszana będzie traktowana jako DWORD zamiast zmiennoprzecinkowa. Aby uzyskać więcej informacji, zobacz Indeksowane mieszanie wierzchołków (Direct3D 9).

Poniższe przykłady kodu pokazują różnicę między kodem FVF, który używa flagi D3DFVF_LASTBETA_UBYTE4 i tej, która nie. Flaga D3DFVF_XYZB3 jest obecna, gdy są używane cztery indeksy mieszania, ponieważ zawsze odejmujesz sumę pierwszych trzech z pierwszej trójki w celu uzyskania czwartego (blend₄ = 1 - (blend₁ + blend ** blend₃)).

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

Zdefiniowana poniżej FVF używa flagi D3DFVF_LAST_UBYTE4.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

deklaracji wierzchołka