Freigeben über


Fixed Function Vertex Processing (Direct3D 9)

In der Pipeline für feste Funktionen wendet die Verarbeitung der Scheitelpunkte in einem Vertexpuffer die aktuellen Transformationsmatrizen für das Gerät an. Vertexvorgänge wie Beleuchtung, Generieren von Clipflags und Aktualisierungsausdehnungen können optional angewendet werden. Bei Verwendung der Verarbeitung fester Funktionen wird das Ändern der Elemente im Zielvertexpuffer durch das D3DPV_DONOTCOPYDATA Flag gesteuert. Dieses Kennzeichen gilt nur für die Verarbeitung fester Funktionen. Die IDirect3DDevice9--Schnittstelle macht die IDirect3DDevice9::P rocessVertices Methode zum Verarbeiten von Scheitelpunkten verfügbar. Sie verarbeiten Scheitelpunkte von einem Vertex-Shader in den Satz von Eingabedatenströmen, wodurch ein einzelner Datenstrom interleavierter Vertexdaten in den Ziel-Vertexpuffer generiert wird, indem sie den IDirect3DDevice9::P rocessVertices-Methode aufruft. Die Methode akzeptiert fünf Parameter, die die Position und Die Anzahl der Scheitelpunkte beschreiben, auf die die Methode ausgerichtet ist, den Zielvertexpuffer und die Verarbeitungsoptionen. Nach dem Aufruf enthält der Zielpuffer die verarbeiteten Vertexdaten.

Die ersten, zweiten und dritten Parameter, SrcStartIndex, DestIndex und VertexCount, spiegeln den Index des ersten zu ladenden Scheitelpunkts wider, den Index innerhalb des Zielpuffers, an dem die Scheitelpunkte platziert werden, sowie die Gesamtanzahl der Scheitelpunkte, die verarbeitet und im Zielpuffer platziert werden sollen. Der vierte Parameter, pDestBuffer sollte auf die Adresse des IDirect3DVertexBuffer9 Schnittstelle des Vertexpufferobjekts festgelegt werden, das die Quellvertizes empfängt. Der Parameter SrcStartIndex gibt den Index an, bei dem die Methode mit der Verarbeitung von Scheitelpunkten beginnen soll.

Der letzte Parameter Flags bestimmt spezielle Verarbeitungsoptionen für die Methode. Sie können diesen Parameter für die Standardvertexverarbeitung auf 0 oder auf D3DPV_DONOTCOPYDATA festlegen, um die Verarbeitung in einigen Situationen zu optimieren. Sie können den D3DPV_DONOTCOPYDATA Wert auch mit einem oder mehreren D3DLOCK Werten kombinieren, die für den Zielpuffer geeignet sind. Wenn Sie Flags auf 0 festlegen, werden Vertexkomponenten des Vertexpuffer-Vertexformats, die von dem Vertexvorgang nicht betroffen sind, weiterhin aus dem Vertex-Shader kopiert oder auf 0 festgelegt. Bei Verwendung von D3DPV_DONOTCOPYDATA überschreibt IDirect3DDevice9::P rocessVertices jedoch keine Farb- und Texturkoordinateninformationen im Zielpuffer, es sei denn, diese Daten werden von Direct3D generiert. Diffuse Farbe wird generiert, wenn beleuchtung aktiviert ist, d. h. D3DRS_LIGHTING auf TRUEfestgelegt ist. Glanzfarbe wird generiert, wenn beleuchtungsfähig ist und Glanz aktiviert ist, d. h. D3DRS_SPECULARENABLE und D3DRS_LIGHTING auf TRUEfestgelegt sind. Glanzfarbe wird auch generiert, wenn Nebel aktiviert ist. Texturkoordinaten werden generiert, wenn Texturtransformation oder Texturgenerierung aktiviert ist. IDirect3DDevice9::P rocessVertices verwendet die aktuellen Renderzustände, um zu bestimmen, welche Vertexverarbeitung durchgeführt werden soll.

FVF-Verwendungseinstellungen für Zielvertexpuffer

Für die IDirect3DDevice9::P rocessVertices--Methode sind bestimmte Einstellungen für die D3DFVF- des Zielvertexpuffers erforderlich. Die FVF-Verwendungseinstellungen müssen mit den aktuellen Einstellungen für die Vertexverarbeitung kompatibel sein.

Für die Verarbeitung fester Funktionen erfordert IDirect3DDevice9::P rocessVertices die folgenden FVF-Einstellungen:

  • Positionstyp ist immer D3DFVF_XYZRHW ; daher sind D3DFVF_XYZ Und D3DFVF_XYZB1 bis D3DFVF_XYZB5 ungültig.
  • Die Kennzeichnungen D3DFVF_NORMAL, D3DFVF_RESERVED0 und D3DFVF_RESERVED2 dürfen nicht festgelegt werden.
  • Das flag D3DFVF_DIFFUSE muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen "true" zurückgibt:
    • Beleuchtung ist aktiviert; d. h., D3DRS_LIGHTING ist TRUE.
    • Beleuchtung ist deaktiviert, diffuse Farbe ist in den Eingabevertexströmen vorhanden, und D3DPV_DONOTCOPYDATA nicht festgelegt ist.
  • Das flag D3DFVF_SPECULAR muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen "true" zurückgibt:
    • Beleuchtung ist aktiviert und Glanzfarbe ist aktiviert; d. h., D3DRS_SPECULARENABLE ist TRUE.
    • Beleuchtung ist deaktiviert, Glanzfarbe ist in den Eingabevertexdatenströmen vorhanden, und D3DPV_DONOTCOPYDATA nicht festgelegt ist.
    • Vertex-Nebel ist aktiviert; d. h., D3DRS_FOGVERTEXMODE ist nicht auf D3DFOG_NONE festgelegt.

Darüber hinaus muss die Texturkoordinatenanzahl auf folgende Weise festgelegt werden:

  • Wenn die Texturtransformation und die Texturgenerierung für alle aktiven Texturphasen deaktiviert sind und die D3DPV_DONOTCOPYDATA nicht festgelegt ist, müssen die Anzahl und der Typ der Ausgabetextkoordinaten mit denen der Eingabevertextextkoordinaten übereinstimmen. Wenn D3DPV_DONOTCOPYDATA festgelegt ist und Texturtransformation und Texturgenerierung deaktiviert sind, werden die Ausgabetextkoordinaten ignoriert.
  • Wenn die Texturtransformation oder Texturgenerierung für alle aktiven Texturphasen aktiviert ist, muss der Ausgabevertex möglicherweise mehr Texturkoordinatensätze enthalten als der Eingabevertex. Dies liegt an der Verbreitung von Texturkoordinaten, die von der Texturgenerierung oder von Texturtransformationen abgeleitet werden. Beachten Sie, dass eine ähnliche Verbreitung von Texturkoordinaten während IDirect3DDevice9::D rawPrimitive Aufrufe auftritt, aber für den Anwendungsprogrammierer nicht sichtbar ist. In diesem Fall generiert Direct3D einen neuen Satz von Texturkoordinaten. Der neue Satz von Texturkoordinaten wird abgeleitet, indem die Texturphasen durchlaufen und die Einstellungen für die Texturgenerierung, die Texturtransformation und den Texturkoordinatenindex analysiert werden, um zu bestimmen, ob für diese Phase eine eindeutige Gruppe von Texturkoordinaten erforderlich ist. Jedes Mal, wenn ein neuer Satz benötigt wird, wird er in zunehmender Reihenfolge zugewiesen. Beachten Sie, dass die maximale und typische Anforderung ein Satz pro Stufe ist, obwohl dies aufgrund der Freigabe von nichttransformierten Texturkoordinaten durch D3DTSS_TEXCOORDINDEX möglicherweise weniger ist.

Daher wird für jede Texturstufe eine neue Reihe von Texturkoordinaten generiert, wenn eine Textur an diese Phase gebunden ist und eine der folgenden Bedingungen zutrifft:

  • Die Texturgenerierung ist für diese Phase aktiviert.
  • Die Texturtransformation ist für diese Phase aktiviert.
  • Nichttransformierte Eingabetextkoordinaten werden erstmals über D3DTSS_TEXCOORDINDEX referenziert.

Wenn Direct3D Texturkoordinaten generiert, muss die Anwendung die folgenden Aktionen ausführen:

  1. Verwenden Sie einen Zielvertexpuffer mit der entsprechenden FVF-Verwendung.
  2. Reprogramieren Sie die D3DTSS_TEXCOORDINDEX der Texturstufe entsprechend der Platzierung der postprozessierten Texturkoordinaten. Beachten Sie, dass die Neuprogrammierung der D3DTSS_TEXCOORDINDEX Einstellung auftritt, wenn der verarbeitete Vertexpuffer in nachfolgenden IDirect3DDevice9::D rawPrimitive und IDirect3DDevice9::D rawIndexedPrimitive Aufrufe verwendet wird.

Schließlich muss die Texturkoordinatendimensionalität (D3DFVF_TEX0 bis D3DFVF_TEX8 ) wie folgt festgelegt werden:

  • Wenn die Texturtransformation und texturgenerierung deaktiviert sind, muss für jeden Texturkoordinatensatz die Texturkoordinatendimensionalität mit der Eingabe übereinstimmen. Wenn die Texturtransformation aktiviert ist, muss die Ausgabedimensionalität mit der anzahl übereinstimmen, die durch die Einstellungen D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 oder D3DTTFF_COUNT4 definiert ist. Wenn die Texturtransformation deaktiviert ist und die Texturgenerierung aktiviert ist, muss die Ausgabedimensionalität den Einstellungen für den Texturgenerierungsmodus entsprechen. Derzeit generieren alle Modi drei Float-Werte.

Wenn IDirect3DDevice9::P rocessVertices aufgrund eines inkompatiblen Zielvertexpuffer-FVF-Codes fehlschlägt, wird der erwartete Code in die Debugausgabe gedruckt (nur Debugbuilds).

Vertexpuffer