Behobene Funktionsvertexverarbeitung (Direct3D 9)
In der Vertexpipeline der festen Funktion 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 auch angewendet werden. Bei Verwendung der Vertexverarbeitung mit festen Funktionen wird das Ändern der Elemente im Zielpunktpuffer durch das D3DPV_DONOTCOPYDATA-Flag gesteuert. Dieses Flag gilt nur für die Vertexverarbeitung fester Funktionen. Die IDirect3DDevice9-Schnittstelle macht die IDirect3DDevice9::P rocessVertices-Methode für die Verarbeitung von Scheitelpunkten verfügbar. Sie verarbeiten Scheitelpunkte von einem Vertex-Shader bis zum Satz von Eingabedatenströmen und generieren einen einzelnen Stream von verschachtelten Vertexdaten zum Zielpunktpuffer, indem Sie die IDirect3DDevice9::P rocessVertices-Methode aufrufen. Die -Methode akzeptiert fünf Parameter, die den Speicherort und die Menge der Scheitelpunkte beschreiben, auf die die Methode abzielt, den Zielpunktpuffer und die Verarbeitungsoptionen. Nach dem Aufruf enthält der Zielpuffer die verarbeiteten Scheitelpunktdaten.
Die ersten, zweiten und dritten Parameter, SrcStartIndex, DestIndex und VertexCount, geben den Index des ersten zu ladenden Scheitelpunkts, den Index innerhalb des Zielpuffers, an dem die Scheitelpunkte platziert werden, und die Gesamtzahl der scheitelpunkte, die verarbeitet und im Zielpuffer platziert werden sollen. Der vierte Parameter pDestBuffer sollte auf die Adresse der IDirect3DVertexBuffer9-Schnittstelle des Vertexpufferobjekts festgelegt werden, das die Quellvertices empfängt. Der SrcStartIndex-Parameter gibt den Index an, bei dem die Methode mit der Verarbeitung von Scheitelpunkten beginnen soll.
Der endgültige Parameter Flags bestimmt spezielle Verarbeitungsoptionen für die Methode. Sie können diesen Parameter für die Standardvertexverarbeitung auf 0 festlegen oder D3DPV_DONOTCOPYDATA , um die Verarbeitung in bestimmten 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 Vertex-Pufferformats des Zielpunktpuffers, die nicht vom Vertex-Vorgang 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 Farben werden generiert, wenn die Beleuchtung aktiviert ist, d. h. D3DRS_LIGHTING auf TRUE festgelegt ist. Die speculare Farbe wird generiert, wenn beleuchtungsaktiv und specular aktiviert ist, d. h. D3DRS_SPECULARENABLE und D3DRS_LIGHTING auf TRUE festgelegt sind. Bei aktiviertem Nebel wird auch eine spiegelförmige Farbe generiert. Texturkoordinaten werden generiert, wenn die Texturtransformation oder die Texturgenerierung aktiviert ist. IDirect3DDevice9::P rocessVertices verwendet die aktuellen Renderzustände, um zu bestimmen, welche Vertexverarbeitung ausgeführt werden soll.
FVF-Nutzungseinstellungen für Zielpunktpuffer
Die IDirect3DDevice9::P rocessVertices-Methode erfordert bestimmte Einstellungen für die D3DFVF des Zielpunktpuffers. Die FVF-Nutzungseinstellungen müssen mit den aktuellen Einstellungen für die Vertexverarbeitung kompatibel sein.
Für die Verarbeitung von festen Funktionsvertexen erfordert IDirect3DDevice9::P rocessVertices die folgenden FVF-Einstellungen:
- Positionstyp ist immer D3DFVF_XYZRHW ; daher sind D3DFVF_XYZ und D3DFVF_XYZB1 durch D3DFVF_XYZB5 ungültig.
- Die Flags D3DFVF_NORMAL, D3DFVF_RESERVED0 und D3DFVF_RESERVED2 dürfen nicht festgelegt werden.
- Das D3DFVF_DIFFUSE-Flag muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen true zurückgibt:
- Die Beleuchtung ist aktiviert; das heißt, D3DRS_LIGHTING ist TRUE.
- Die Beleuchtung ist deaktiviert, die diffuse Farbe ist in den Eingangsvertexströmen vorhanden, und D3DPV_DONOTCOPYDATA ist nicht festgelegt.
- Das D3DFVF_SPECULAR-Flag muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen true zurückgibt:
- Die Beleuchtung ist aktiviert, und die farbspezulare Farbe ist aktiviert. das heißt, D3DRS_SPECULARENABLE ist TRUE.
- Die Beleuchtung ist deaktiviert, die spiegelförmige Farbe ist in den Eingabevertexstreams vorhanden, und D3DPV_DONOTCOPYDATA ist nicht festgelegt.
- Scheitelpunktnebel ist aktiviert. das heißt, D3DRS_FOGVERTEXMODE ist nicht auf D3DFOG_NONE festgelegt.
Darüber hinaus muss die Anzahl der Texturkoordinaten wie folgt festgelegt werden:
- Wenn texturtransformation und Texturgenerierung für alle aktiven Texturphasen deaktiviert sind und die D3DPV_DONOTCOPYDATA nicht festgelegt ist, sind Anzahl und Typ der Ausgabetexturkoordinaten erforderlich, um denen der Eingabevertextexturkoordinaten zu entsprechen. Wenn D3DPV_DONOTCOPYDATA festgelegt ist und Texturtransformation und Texturgenerierung deaktiviert sind, werden die Ausgabetexturkoordinaten ignoriert.
- Wenn die Texturtransformation oder Texturgenerierung für aktive Texturphasen aktiviert ist, muss der Ausgabevertex möglicherweise mehr Texturkoordinatensätze als der Eingabevertex enthalten. Dies ist auf die Verbreitung von Texturkoordinaten von denen zurückzuführen, die durch die Texturgenerierung generiert oder durch Texturtransformationen abgeleitet werden. Beachten Sie, dass eine ähnliche Proliferation von Texturkoordinaten während IDirect3DDevice9::D rawPrimitive-Aufrufen 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 festzustellen, ob für diese Phase ein eindeutiger Satz von Texturkoordinaten erforderlich ist. Jedes Mal, wenn eine neue Gruppe erforderlich ist, wird sie in zunehmender Reihenfolge zugeordnet. Beachten Sie, dass die maximale und typische Anforderung einen Satz pro Stufe beträgt, obwohl sie aufgrund der Freigabe nicht übersetzter Texturkoordinaten über D3DTSS_TEXCOORDINDEX möglicherweise geringer ist.
Daher wird für jede Texturphase ein neuer Satz 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.
- Nicht übersetzte Eingabetexturkoordinaten werden erstmals über D3DTSS_TEXCOORDINDEX referenziert.
Wenn Direct3D Texturkoordinaten generiert, muss die Anwendung die folgenden Aktionen ausführen:
- Verwenden Sie einen Zielpunktpuffer mit der entsprechenden FVF-Verwendung.
- Umprogrammieren Sie die D3DTSS_TEXCOORDINDEX der Texturstufe entsprechend der Platzierung der nachverarbeiteten Texturkoordinaten. Beachten Sie, dass die Neuprogrammierung der einstellung D3DTSS_TEXCOORDINDEX erfolgt, wenn der verarbeitete Vertexpuffer in nachfolgenden IDirect3DDevice9::D rawPrimitive - und IDirect3DDevice9::D rawIndexedPrimitive-Aufrufen verwendet wird.
Schließlich muss die Texturkoordinatendimensionalität (D3DFVF_TEX0 bis D3DFVF_TEX8 ) wie folgt festgelegt werden:
- Wenn die Texturtransformation und die Texturgenerierung für jeden Texturkoordinatensatz deaktiviert sind, muss die Dimensionalität der Ausgabetexturkoordinate 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 wird. Wenn die Texturtransformation deaktiviert und die Texturgenerierung aktiviert ist, muss die Ausgabedimensionalität mit den Einstellungen für den Texturgenerierungsmodus übereinstimmen. derzeit generieren alle Modi drei Floatwerte.
Wenn IDirect3DDevice9::P rocessVertices aufgrund eines inkompatiblen Zielvertexpuffer-FVF-Codes fehlschlägt, wird der erwartete Code in die Debugausgabe gedruckt (nur Debugbuilds).
Zugehörige Themen