Freigeben über


Verwenden Higher-Order Grundtypen (Direct3D 9)

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

Bestimmen Higher-Order primitiven Unterstützung

Das DevCaps-Element der D3DCAPS9-Struktur kann abgefragt werden, um die Unterstützungsebene für Vorgänge zu bestimmen, die höhere Ordnungsgrundsätze umfassen. In der folgenden Tabelle sind die Gerätefunktionen aufgeführt, die sich auf Grundtypen höherer Reihenfolge in Direct3D 9 beziehen.

Gerätefunktion Beschreibung
D3DDEVCAPS_NPATCHES Das Gerät unterstützt N-Patches und basiert auf gekrümmten PN-Dreiecken (einer besonderen Art von kubischen Bézier-Dreiecken).
D3DDEVCAPS_QUINTICRTPATCHES Das Gerät unterstützt quintische Bézierkurven und B-Splines.
D3DDEVCAPS_RTPATCHES Das Gerät unterstützt rechteckige und dreieckige Patches (RT-Patches).
D3DDEVCAPS_RTPATCHHANDLEZERO RT-Patches können mit handle zero effizient gezeichnet werden.

 

Beachten Sie, dass D3DDEVCAPS_RTPATCHHANDLEZERO nicht bedeutet, dass ein Patch mit handle zero gezeichnet werden kann. Ein Handle Zero-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 zero) werden so effizient wie zwischengespeicherte Patches gezeichnet.

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 mithilfe eines beliebigen Dreiecksrenderingaufrufs gerendert werden, indem N-Patches über den Aufruf von IDirect3DDevice9::SetNPatchMode( nSegments ) mit nSegments-Wert größer als 1.0 aktiviert werden. Rect/Tri-Patches müssen mithilfe der folgenden expliziten Einstiegspunkte gerendert werden.

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

IDirect3DDevice9::D rawRectPatch zeichnet einen rechteckigen High-Order-Patch, der vom pRectPatchInfo-Parameter unter Verwendung der aktuell festgelegten Streams angegeben wird. Der Handle-Parameter wird verwendet, um den Patch einem Handle zuzuordnen, sodass beim nächsten Zeichnen des Patches keine erneute Angabe von pRectPatchInfo erforderlich ist. Dadurch können Differenzkoeffizienten oder andere Informationen vorkompiliert und zwischengespeichert werden, sodass nachfolgende Aufrufe von IDirect3DDevice9::D rawRectPatch mithilfe desselben Handles effizient ausgeführt werden können.

Es ist vorgesehen, dass eine Anwendung für statische Patches den Vertex-Shader und die entsprechenden Streams festlegen, Patchinformationen im pRectPatchInfo-Parameter bereitstellt und ein Handle angibt, damit Direct3D Informationen erfassen und zwischenspeichern kann. Anschließend kann die Anwendung IDirect3DDevice9::D rawRectPatch aufrufen, wobei 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 muss beim Rendern eines zwischengespeicherten Patches derselbe Vertex-Shader festgelegt werden, der bei der Erfassung festgelegt wurde.

Bei dynamischen Patches ändern sich die Patchdaten für jedes Rendering des Patches, sodass es nicht effizient ist, Informationen zwischenzuspeichern. Die Anwendung kann dies auf Direct3D übertragen, indem Handle auf 0 festgelegt wird. In diesem Fall zeichnet Direct3D den Patch mit den aktuell festgelegten Streams und den pNumSegs-Werten und speichert keine Informationen zwischen. Es ist nicht gültig, Handle gleichzeitig auf 0 und pPatch auf NULL festzulegen.

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

IDirect3DDevice9::D rawTriPatch ähnelt IDirect3DDevice9::D rawRectPatch , mit der Ausnahme, dass es einen dreieckigen Patch mit hoher Reihenfolge zeichnet.

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.

Für Normale können Sie sie entweder direkt bereitstellen oder direct3D 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 dreieckigen Patches generierten Koordinaten sind baryzentrische splinebasierte Koordinaten, wie in den folgenden Abbildungen dargestellt.

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

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

Grundtypen höherer Ordnung