Verwenden Higher-Order Primitiven (Direct3D 9)

In diesem Abschnitt erfahren Sie, wie Sie Primitive höherer Ordnung in Ihrer Anwendung verwenden.

Bestimmen Higher-Order primitiven Unterstützung

Das DevCaps-Member der D3DCAPS9-Struktur kann abgefragt werden, um den Grad der Unterstützung für Vorgänge zu bestimmen, die Primitive höherer Ordnung verwenden. In der folgenden Tabelle sind die Gerätefunktionen im Zusammenhang mit primitiven Typen höherer Ordnung in Direct3D 9 aufgeführt.

Gerätefunktion BESCHREIBUNG
D3DDEVCAPS _ NPATCHES Das Gerät unterstützt N-Patches und basiert auf gekrümmten PN-Dreiecken (eine besondere Art kubischer Bézierdreiecke).
D3DDEVCAPSICRTPATCHES _ Das Gerät unterstützt zierliche Bézierkurven und B-Splines.
D3DDEVCAPS _ RTPATCHES Das Gerät unterstützt rechteckige und dreieckige Patches (RT-Patches).
D3DDEVCAPS _ RTPATCHHANDKAPSELERO RT-Patches können effizient mit handle 0 gezeichnet werden.

Beachten Sie, dass D3DDEVCAPS RTPATCHHANDHINWEISERO nicht bedeutet, dass ein Patch mit handle _ 0 (null) gezeichnet werden kann. Ein Handle mit null Patch kann immer gezeichnet werden, unabhängig davon, ob diese Gerätefunktion festgelegt ist oder nicht. Wenn diese Funktion festgelegt ist, erfordert die Hardwarearchitektur keine Zwischenspeicherung von Informationen, und nicht zwischengespeicherte Patches (handle 0) werden so effizient gezeichnet wie zwischengespeicherte Patches.

Zeichnen von Patches

Direct3D 9 unterstützt zwei Typen von Primitiven höherer Ordnung oder Patches. Diese werden als N-Patches und Rect/Tri-Patches bezeichnet. N-Patches können mit einem beliebigen Dreiecksrenderingaufruf gerendert werden, indem N-Patches durch den Aufruf von IDirect3DDevice9::SetNPatchMode( nSegments ) mit einem nSegments-Wert größer als 1.0 ermöglicht werden. Rect/Tri-Patches müssen mit den folgenden expliziten Einstiegspunkten gerendert werden.

Sie können die folgenden Methoden verwenden, um Patches zu zeichnen.

IDirect3DDevice9::D rawRectPatch zeichnet einen rechteckigen, vom pRectPatchInfo-Parameter angegebenen hochwertigen Patch unter Verwendung der aktuell festgelegten Streams. Der Handle-Parameter wird verwendet, um den Patch einem Handle zu zuordnen, sodass pRectPatchInfo nicht beim nächsten Patch gezeichnet werden muss. Dadurch können Differenzkoeffizienten oder andere Informationen vorab berechnet und zwischengespeichert werden, wodurch nachfolgende Aufrufe von IDirect3DDevice9::D rawRectPatch mit demselben Handle effizient ausgeführt werden können.

Für statische Patches sollte eine Anwendung den Vertex-Shader und die entsprechenden Streams festlegen, Patchinformationen im pRectPatchInfo-Parameter angeben und ein Handle angeben, damit Direct3D Informationen erfassen und zwischenspeichern kann. Die Anwendung kann anschließend IDirect3DDevice9::D rawRectPatch aufrufen, während pRectPatchInfo auf NULL festgelegt ist, um den Patch effizient zu zeichnen. Beim Zeichnen eines zwischengespeicherten Patches werden die aktuell festgelegten Streams ignoriert. Es ist jedoch möglich, die zwischengespeicherten pNumSegs zu überschreiben, indem neue Werte für pNumSegs angegeben werden. Außerdem ist es erforderlich, beim Rendern eines zwischengespeicherten Patches den gleichen Vertex-Shader wie bei der Erfassung festgelegt zu haben.

Bei dynamischen Patches ändern sich die Patchdaten für jedes Rendering des Patches, sodass es nicht effizient ist, Informationen zwischenspeichern. Die Anwendung kann dies direct3D übermitteln, indem handle auf 0 (0) festlegen. In diesem Fall zeichnet Direct3D den Patch mithilfe der aktuell festgelegten Streams und der pNumSegs-Werte und speichert keine Informationen zwischen. Es ist nicht zulässig, handle gleichzeitig auf 0 und pPatch auf NULL zu setzen.

Durch die Zurückstellung von pRectPatchInfo für dasselbe Handle kann die Anwendung die zuvor zwischengespeicherten Informationen überschreiben.

IDirect3DDevice9::D rawTriPatch ähnelt IDirect3DDevice9::D rawRectPatch, zeichnet jedoch einen triangularen, hohen Patch.

Generieren von Normal- und Texturkoordinaten

Wenn Sie einen FVF-Shader (Flexible Vertex Format) verwenden, ist die automatische Generierung von Normal- und Texturkoordinaten nicht möglich.

Im Normalfall können Sie sie entweder direkt oder direct3D für Sie berechnen lassen.

Die für rechteckige Patches generierten Koordinaten sind splinebasierte Koordinaten, wie in den folgenden Abbildungen dargestellt.

Abbildung einer ursprünglichen Textur und der Textur mit splinebasierten Koordinaten

Die für dreieckige Patches generierten Koordinaten sind baryzentrierte splinebasierte Koordinaten, wie in den folgenden Abbildungen dargestellt.

Abbildung einer ursprünglichen Textur und der Textur mit baryzentrierten splinebasierten Koordinaten

Wenn eine Anwendung den Bereich der generierten Texturkoordinaten ändern muss, kann dies mithilfe von Texturtransformationen erfolgen.

Primitive höherer Ordnung