Feste Funktions-FVF-Codes (Direct3D 9)
Ein FVF-Code beschreibt den Inhalt von Scheitelpunkten, die in einem einzelnen Datenstrom gespeichert sind. Es gibt in der Regel Daten an, die von der Vertexverarbeitungspipeline mit fester Funktion verarbeitet werden sollen. Dies ist eine Vertexdeklaration im älteren Stil; um die aktuelle Vertexdeklarationsformatvorlage anzuzeigen, lesen Sie D3DVERTEXELEMENT9.
Direct3D-Anwendungen können Modellvertizes auf verschiedene Weise definieren. Die Unterstützung für flexible Vertexdefinitionen, auch als flexible Vertexformate oder flexible Vertexformatcodes bezeichnet, ermöglicht es Ihrer Anwendung, nur die benötigten Vertexkomponenten zu verwenden, wodurch die nicht verwendeten Komponenten eliminiert werden. Wenn Sie nur die erforderlichen Vertexkomponenten verwenden, kann Ihre Anwendung Arbeitsspeicher sparen und die verarbeitungsbandbreite minimieren, die zum Rendern von Modellen erforderlich ist. Sie beschreiben, wie Die Scheitelpunkte mithilfe einer Kombination aus D3DFVF- Codes formatiert werden.
Die FVF-Spezifikation enthält Formate für die Punktgröße, die durch D3DFVF_PSIZE angegeben wird. Diese Größe wird in Kameraraumeinheiten für nicht transformierte und beleuchtete (TL)-Scheitelpunkte und in Geräteraumeinheiten für TL-Scheitelpunkte ausgedrückt.
Die Renderingmethoden der IDirect3DDevice9 Schnittstelle stellen C++-Anwendungen mit Methoden bereit, die eine Kombination dieser Flags akzeptieren, und verwenden sie, um zu bestimmen, wie Grundtypen gerendert werden. Im Grunde teilen diese Flags dem System mit, welche Vertexkomponenten - Position, Vertexmischung gewichtet, normal, Farben und die Anzahl und das Format von Texturkoordinaten - Ihre Anwendung verwendet und indirekt, welche Teile der Renderingpipeline Direct3D auf sie anwenden sollen. Darüber hinaus kommuniziert das Vorhandensein oder Fehlen eines bestimmten Vertexformat-Flags mit dem System, in dem Vertexkomponentenfelder im Arbeitsspeicher vorhanden sind und die Sie weggelassen haben.
Um Geräteeinschränkungen zu ermitteln, können Sie ein Gerät nach den Werten von D3DFVFCAPS_DONOTSTRIPELEMENTS und D3DFVFCAPS_TEXCOORDCOUNTMASK im FVFCaps-Element von D3DCAPS9abfragen.
Texturkoordinaten können in verschiedenen Formaten deklariert werden, sodass Texturen mit nur wenigen Koordinaten oder bis zu vier Texturkoordinaten (für 2D-projizierte Texturkoordinaten) adressiert werden können. Weitere Informationen finden Sie unter Texturkoordinatenformate (Direct3D 9). Verwenden Sie den D3DFVF_TEXCOORDSIZEN Satz von Makros, um Bitmuster zu erstellen, die die von Ihrem Vertexformat verwendeten Texturkoordinatenformate identifizieren.
Jede Komponente wird von keiner Anwendung verwendet. Die gegenseitigen homogenen W-Felder (RHW) und Scheitelpunktnormale schließen sich gegenseitig aus. Die meisten Anwendungen versuchen auch nicht, alle acht Sätze von Texturkoordinaten zu verwenden, aber Direct3D verfügt über diese Kapazität. Es gibt mehrere Einschränkungen, mit denen Sie Flags verwenden können, die Sie mit anderen Flags verwenden können. Sie können z. B. die kennzeichnungen 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 D3DFVF_LASTBETA_UBYTE4-Flag 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 Indizierten Vertex-Blending (Direct3D 9).
Die folgenden Codebeispiele zeigen den Unterschied zwischen einem FVF-Code, der das D3DFVF_LASTBETA_UBYTE4-Flag verwendet, und einem, das nicht. Das Kennzeichen D3DFVF_XYZB3 ist vorhanden, wenn vier Blendungsindizes verwendet werden, da Sie immer die Summe der ersten drei von der ersten Zahl 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
};
Der unten definierte FVF verwendet das D3DFVF_LAST_UBYTE4 Flag.
#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
};
Verwandte Themen