Freigeben über


Feste Funktions-FVF-Codes (Direct3D 9)

Ein FVF-Code beschreibt den Inhalt von Scheitelpunkten, die in einem einzelnen Datenstrom gespeichert sind. In der Regel werden Daten angegeben, die von der Pipeline für die Verarbeitung fester Funktionsvertex verarbeitet werden sollen. Dies ist eine Vertexdeklaration im älteren Stil. Informationen zum aktuellen Vertexdeklarationsstil finden Sie unter D3DVERTEXELEMENT9.

Direct3D-Anwendungen können Modellvertices auf verschiedene Arten definieren. Die Unterstützung für flexible Vertexdefinitionen, auch als flexible Vertexformate oder Flexible Vertex-Formatcodes bezeichnet, ermöglicht es Ihrer Anwendung, nur die benötigten Vertexkomponenten zu verwenden, sodass nicht verwendete Komponenten wegfallen. Wenn Nur die erforderlichen Vertexkomponenten verwendet werden, kann Ihre Anwendung Arbeitsspeicher sparen und die Verarbeitungsbandbreite minimieren, die zum Rendern von Modellen erforderlich ist. Sie beschreiben, wie Ihre Scheitelpunkte formatiert werden, indem Sie eine Kombination aus D3DFVF-Codes verwenden.

Die FVF-Spezifikation enthält Formate für die Punktgröße, die durch D3DFVF_PSIZE angegeben werden. Diese Größe wird in Kameraraumeinheiten für nicht transformierte und beleuchtete Scheitelpunkte (TL) und in Geräteraumeinheiten für TL-Scheitelpunkte ausgedrückt.

Die Renderingmethoden der IDirect3DDevice9-Schnittstelle stellen C++-Anwendungen Methoden bereit, die eine Kombination dieser Flags akzeptieren und verwenden sie, um zu bestimmen, wie Primitive gerendert werden. Im Grunde sagen diese Flags dem System, welche Vertexkomponenten – Position, Vertexmischungsgewichte, Normal, Farben und Anzahl und Format der Texturkoordinaten – Ihre Anwendung verwendet und indirekt, welche Teile der Renderingpipeline Direct3D auf sie anwenden soll. Darüber hinaus kommuniziert das Vorhandensein oder Fehlen eines bestimmten Vertexformatflags dem System, welche Vertexkomponentenfelder im Arbeitsspeicher vorhanden sind und welche Sie ausgelassen haben.

Zum Ermitteln von Geräteeinschränkungen können Sie ein Gerät nach den Werten von D3DFVFCAPS_DONOTSTRIPELEMENTS und D3DFVFCAPS_TEXCOORDCOUNTMASK im FVFCaps-Member von D3DCAPS9 abfragen.

Texturkoordinaten können in verschiedenen Formaten deklariert werden, sodass Texturen mit nur einer Koordinate oder bis zu vier Texturkoordinaten (für 2D projizierte Texturkoordinaten) behandelt werden können. Weitere Informationen finden Sie unter Texturkoordinatenformate (Direct3D 9). Verwenden Sie die D3DFVF_TEXCOORDSIZEN Satz von Makros, um Bitmuster zu erstellen, die die Texturkoordinatenformate identifizieren, die ihr Vertexformat verwendet.

Keine Anwendung verwendet jede Komponente. Die wechselseitigen homogenen W (RHW) und Vertexnormalfelder schließen sich gegenseitig aus. Die meisten Anwendungen werden auch nicht versuchen, alle acht Sätze von Texturkoordinaten zu verwenden, aber Direct3D verfügt über diese Kapazität. Es gibt mehrere Einschränkungen, welche Flags Sie mit anderen Flags verwenden können. Beispielsweise können Sie die flags D3DFVF_XYZ und D3DFVF_XYZRHW nicht zusammen verwenden, da dies darauf hindeutet, dass Ihre Anwendung die Position eines Scheitelpunkts sowohl mit untransformierten als auch mit transformierten Scheitelpunkten beschreibt.

Um die indizierte Vertexmischung zu verwenden, sollte das flag D3DFVF_LASTBETA_UBYTE4 am Ende der FVF-Deklaration angezeigt werden. Das Vorhandensein dieses Flags gibt an, dass die fünfte Mischgewichtung als DWORD anstelle von float behandelt wird. Weitere Informationen finden Sie unter Indizierte Vertexmischung (Direct3D 9).

Die folgenden Codebeispiele zeigen den Unterschied zwischen einem FVF-Code, der das flag D3DFVF_LASTBETA_UBYTE4 verwendet, und einem, der dies nicht tut. Das Flag D3DFVF_XYZB3 ist vorhanden, wenn vier Mischindizes verwendet werden, da Sie immer die Summe der ersten drei von der Nummer eins subtrahieren, um den vierten zu erhalten (blend₄ = 1 - (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
};

Die unten definierte FVF verwendet das flag 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
};

Vertexdeklaration