Vertexverarbeitung der Funktion korrigiert (Direct3D 9)
In der Vertexpipeline der festen Funktion wendet die Verarbeitung der Scheitelpunkte in einem Scheitelpunktpuffer die aktuellen Transformationsmatrizen für das Gerät an. Vertexvorgänge wie Beleuchtung, Generieren von Clipflags und Aktualisieren von Erweiterungen können optional ebenfalls angewendet werden. Bei Verwendung der Vertexverarbeitung fester Funktionen wird das Ändern der Elemente im Zielvertexpuffer 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 verfügbar, um Scheitelungen zu verarbeiten. Sie verarbeiten Scheitelpunkte von einem Vertex-Shader bis zum Satz von Eingabedatenströmen und generieren einen einzelnen Stream verleavter Vertexdaten zum Ziel-Scheitelpunktpuffer, 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 zielt, den Ziel-Scheitelpunktpuffer und die Verarbeitungsoptionen. Nach dem Aufruf enthält der Zielpuffer die verarbeiteten Scheitelpunktdaten.
Der erste, zweite und dritte Parameter, SrcStartIndex, DestIndex und VertexCount, spiegeln den Index des ersten zu ladenden Scheitelpunkts, den Index im Zielpuffer, in dem die Scheitelpunkte platziert werden, und die Gesamtzahl der Scheitelpunkte wider, die im Zielpuffer zu verarbeiten und zu platzieren sind. Der vierte Parameter pDestBuffer sollte auf die Adresse der IDirect3DVertexBuffer9-Schnittstelle des Scheitelpunktpufferobjekts festgelegt werden, das die Quellvertices empfangen wird. Der SrcStartIndex-Parameter gibt den Index an, an dem die Methode mit der Verarbeitung von Scheiteltices 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 in einigen Situationen auf D3DPV _ DONOTCOPYDATA festlegen, um die Verarbeitung zu optimieren. Sie können auch den D3DPV DONOTCOPYDATA-Wert mit mindestens einem _ D3DLOCK-Wert kombinieren, der für den Zielpuffer geeignet ist. Wenn Sie Flags auf 0 festlegen, werden Scheitelpunktkomponenten des Scheitelpunktformats des Scheitelpunktpuffers, die nicht vom Scheitelpunktvorgang 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 die Beleuchtung aktiviert ist, d. b. D3DRS _ LIGHTING ist auf TRUE festgelegt. Specular color is generated when lighting is enabled and specular is enabled, that is, D3DRS_SPECULARENABLE and D3DRS_LIGHTING are set to TRUE. Die Specular-Farbe wird auch generiert, wenn Einfärbung aktiviert ist. Texturkoordinaten werden generiert, wenn Texturtransformation oder Texturgenerierung aktiviert ist. IDirect3DDevice9::P rocessVertices verwendet die aktuellen Renderzustände, um zu bestimmen, welche Scheitelpunktverarbeitung erfolgen soll.
FVF-Einstellungen für Ziel-Scheitelpunktpuffer
Die IDirect3DDevice9::P rocessVertices-Methode erfordert bestimmte Einstellungen für die D3DFVF des Zielvertexpuffers. Die FVF-Nutzungseinstellungen müssen mit den aktuellen Einstellungen für die Scheitelpunktverarbeitung kompatibel sein.
Für die Vertexverarbeitung fester Funktionen erfordert IDirect3DDevice9::P rocessVertices die folgenden FVF-Einstellungen:
- Der Positionstyp ist immer D3DFVF _ XYZRHW. Daher sind D3DFVF XYZ und _ D3DFVF _ XYZB1 bis D3DFVF _ XYZB5 ungültig.
- Die Flags D3DFVF _ NORMAL,D3DFVF RESERVED0 und _ D3DFVF _ RESERVED2 dürfen nicht festgelegt werden.
- Das DIFFUS-Flag _ D3DFVF muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen TRUE zurückgibt:
- Beleuchtung ist aktiviert. Das heißt, D3DRS _ LIGHTING ist TRUE.
- Die Beleuchtung ist deaktiviert, die diffuse Farbe ist in den Eingabevertexstreams vorhanden, und D3DPV _ DONOTCOPYDATA ist nicht festgelegt.
- Das _ SPECULAR-Flag D3DFVF muss festgelegt werden, wenn ein OR-Vorgang der folgenden Bedingungen TRUE zurückgibt:
- Die Beleuchtung ist aktiviert, und die Specular-Farbe ist aktiviert. D3DRS _ SPECULARENABLE ist true.
- Die Beleuchtung ist deaktiviert, die Specularfarbe ist in den Eingabevertexstreams vorhanden, und D3DPV _ DONOTCOPYDATA ist nicht festgelegt.
- Scheitelpunkt-Scheitelpunkt ist aktiviert. _D3DRSSCHLUSSVERTEXMODE ist nicht auf D3DFOG _ NONE festgelegt.
Darüber hinaus muss die Texturkoordinatenanzahl wie folgt festgelegt werden:
- Wenn Texturtransformation und Texturgenerierung für alle aktiven Texturphasen deaktiviert sind und D3DPV _ DONOTCOPYDATA nicht festgelegt ist, sind die Anzahl und der Typ der Ausgabetexturkoordinaten erforderlich, um mit denen der Texturkoordinaten der Eingabevertextextur überein stimmen. Wenn D3DPV DONOTCOPYDATA festgelegt ist und Texturtransformation und Texturgenerierung deaktiviert sind, werden die _ Ausgabetexturkoordinaten ignoriert.
- Wenn Texturtransformation oder Texturgenerierung für aktive Texturphasen aktiviert ist, muss der Ausgabevertex möglicherweise mehr Texturkoordinatensätze enthalten als der Eingabevertex. Dies liegt an der Verbreitung von Texturkoordinaten, die von Texturgenerierung generiert oder von Texturtransformationen abgeleitet werden. Beachten Sie, dass eine ähnliche Zunahme von Texturkoordinaten bei 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 Texturstufen durchschritten und die Einstellungen für Texturgenerierung, Texturtransformation und Texturkoordinatenindex analysiert werden, um zu bestimmen, ob für diese Phase ein eindeutiger Satz von Texturkoordinaten erforderlich ist. Jedes Mal, wenn eine neue Gruppe erforderlich ist, wird sie in auf steigender Reihenfolge zugeordnet. Beachten Sie, dass die maximale und typische Anforderung eine Menge pro Phase ist, obwohl sie aufgrund der Gemeinsamen Nutzung nicht übersetzter Texturkoordinaten über D3DTSS _ TEXCOORDINDEX geringer sein kann.
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.
- Auf nicht übersetzte Eingabetexturkoordinaten wird zum ersten Mal über D3DTSS _ TEXCOORDINDEX verwiesen.
Wenn Direct3D Texturkoordinaten generiert, muss die Anwendung die folgenden Aktionen ausführen:
- Verwenden Sie einen Ziel-Scheitelpunktpuffer mit der entsprechenden FVF-Nutzung.
- Programieren Sie den D3DTSS TEXCOORDINDEX der Texturphase entsprechend der Platzierung der nachverarbeiteten _ Texturkoordinaten neu. Beachten Sie, dass die Neuprogrammierung der D3DTSS TEXCOORDINDEX-Einstellung auftritt, wenn der verarbeitete Scheitelpunktpuffer 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 für jeden Texturkoordinatensatz Texturtransformation und Texturgenerierung deaktiviert sind, muss die Ausgabetexturkoordinatendimensionalität mit der Eingabe übereinstimmen. Wenn die Texturtransformation aktiviert ist, muss die Ausgabedimensionalität mit der Anzahl übereinstimmen, die in den Einstellungen D3DTTFF _ COUNT1, D3DTTFF _ COUNT2, D3DTTFF COUNT3 oder _ D3DTTFF COUNT4 definiert _ ist. 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 Gleitkommawerte.
Wenn IDirect3DDevice9::P rocessVertices aufgrund eines inkompatiblen FVF-Ziel-Scheitelpunktpuffers fehlschlägt, wird der erwartete Code in die Debugausgabe ausgegeben (nur Debugbuilds).