Texturumbruch (Direct3D 9)

Kurz gesagt ändert die Texturumbruch die grundlegende Art und Weise, wie Direct3D texturierte Polygone mithilfe der für jeden Scheitelpunkt angegebenen Texturkoordinaten rastert. Beim Rastern eines Polygons interpoliert das System zwischen den Texturkoordinaten an den jeweiligen Scheitelpunkten des Polygons, um die Texel zu bestimmen, die für jedes Pixel des Polygons verwendet werden sollen. Normalerweise behandelt das System die Textur als 2D-Ebene und interpoliert neue Texels, indem es den kürzesten Weg von Punkt A innerhalb einer Textur zu Punkt B nimmt. Wenn Punkt A die Position u, v (0,8, 0,1) und Punkt B bei (0,1,0.1) darstellt, sieht die Interpolationslinie wie im folgenden Diagramm aus.

Diagramm einer Interpolationslinie zwischen zwei Punkten

Beachten Sie, dass der kürzeste Abstand zwischen A und B in dieser Abbildung ungefähr durch die Mitte der Textur verläuft. Durch das Aktivieren der U-Textur- oder V-Texturkoordinatenumbruch wird geändert, wie Direct3D die kürzeste Route zwischen Texturkoordinaten in u- und v-Richtung wahrnimmt. Per Definition bewirkt texture wrapping, dass der Rasterisierer den kürzesten Weg zwischen Texturkoordinatensätzen nimmt, vorausgesetzt, dass 0,0 und 1,0 zufällig sind. Das letzte Bit ist der knifflige Teil: Sie können sich vorstellen, dass das Aktivieren des Texturumbruchs in eine Richtung dazu führt, dass das System eine Textur behandelt, als wäre sie um einen Zylinder gewickelt. Betrachten Sie beispielsweise das folgende Diagramm.

Diagramm einer Textur und zwei Punkten, die um einen Zylinder gewickelt sind

Die obige Abbildung zeigt, wie sich das Umschließen in u -Richtung auf die Interpolation von Texturkoordinaten durch das System auswirkt. Wenn Sie die gleichen Punkte wie im Beispiel für normale oder nicht bearbeitete Texturen verwenden, können Sie sehen, dass der kürzeste Weg zwischen den Punkten A und B nicht mehr über die Mitte der Textur verläuft. es ist jetzt über die Grenze, wo 0.0 und 1.0 zusammen vorhanden sind. Das Umschließen in v-Richtung ist ähnlich, mit dem Unterschied, dass es die Textur um einen Zylinder umschließt, der auf der Seite liegt. Das Umschließen in u- und v-Richtung ist komplexer. In dieser Situation können Sie sich die Textur als Torus oder Ring vorzustellen.

Die am häufigsten verwendete praktische Anwendung für Texturumbrüche ist die Durchführung von Umgebungszuordnungen. Normalerweise erscheint ein Objekt, das mit einer Umgebungskarte strukturiert ist, sehr reflektierend und zeigt ein gespiegeltes Bild der Umgebung des Objekts in der Szene. Stellen Sie sich für diese Diskussion einen Raum mit vier Wänden vor, die jeweils mit einem Buchstaben R, G, B, Y und den entsprechenden Farben bemalt sind: rot, grün, blau und gelb. Die Umgebungskarte für einen so einfachen Raum könnte wie die folgende Abbildung aussehen.

Abbildung von vertikalen Streifen von Rot, Grün, Blau und Gelb

Stellen Sie sich vor, die Decke des Raums wird von einer perfekt reflektierenden, vierseitigen Säule gehalten. Das Zuordnen der Umgebungszuordnungstextur zur Säule ist einfach. die Säule so aussehen zu lassen, als würde sie die Buchstaben und Farben widerspiegeln, ist nicht so einfach. Das folgende Diagramm zeigt einen Drahtrahmen der Säule mit den entsprechenden Texturkoordinaten in der Nähe der oberen Scheitelpunkte. Die Naht, bei der die Hülle die Ränder der Textur kreuzt, wird mit einer gepunkteten Linie angezeigt.

Diagramm eines Rechtecks mit einer bissekierenden gepunkteten Linie

Wenn die Umbruchrichtung in u-Richtung aktiviert ist, zeigt die texturierte Säule die Farben und Symbole der Umgebungskarte entsprechend an, und an der Naht in der Vorderseite der Textur wählt der Rasterisierer ordnungsgemäß den kürzesten Weg zwischen den Texturkoordinaten, vorausgesetzt, dass die U-Koordinaten 0.0 und 1.0 dieselbe Position gemeinsam haben. Die strukturierte Säule sieht wie die folgende Abbildung aus.

Abbildung einer Säule, die aus roten, grünen, blauen und gelben Quadranten besteht

Wenn der Texturumbruch nicht aktiviert ist, interpoliert der Rasterisierer nicht in die Richtung, die zum Generieren eines glaubwürdigen, reflektierten Bilds erforderlich ist. Vielmehr enthält der Bereich an der Vorderseite der Säule eine horizontal komprimierte Version der Texel zwischen u-Koordinaten 0,175 und 0,875, während sie durch die Mitte der Textur gehen. Der Umbrucheffekt ist ruiniert.

Verwenden von Texturumbruch

Rufen Sie zum Aktivieren des Texturumbruchs die IDirect3DDevice9::SetRenderState-Methode auf, wie im folgenden Codebeispiel gezeigt.

d3dDevice->SetRenderState(D3DRS_WRAP0, D3DWRAPCOORD_0);

Der erste von IDirect3DDevice9::SetRenderState akzeptierte Parameter ist ein festzulegender Renderzustand. Geben Sie einen der D3DRS_WRAP0 durch D3DRS_WRAP7 aufgezählten Werte an, die angeben, für welche Texturebene der Wrapping festgelegt werden soll. Geben Sie die D3DWRAPCOORD_0 über D3DWRAPCOORD_3 Flags im zweiten Parameter an, um die Texturumbruchrichtung in der entsprechenden Richtung zu aktivieren, oder kombinieren Sie sie, um das Umbruchen in mehrere Richtungen zu aktivieren. Wenn Sie ein Flag weglassen, ist der Texturumbruch in der entsprechenden Richtung deaktiviert. Um die Texturumbruch für eine Reihe von Texturkoordinaten zu deaktivieren, legen Sie den Wert für den entsprechenden Renderzustand auf 0 fest.

Verwechseln Sie texture wrapping nicht mit den ähnlich benannten Texturadressierungsmodi. Texturumbruch wird vor der Texturadressierung ausgeführt. Stellen Sie sicher, dass die Texturumbruchdaten keine Texturkoordinaten außerhalb des Bereichs von [0.0, 1.0] enthalten, da dies zu nicht definierten Ergebnissen führt. Weitere Informationen zur Texturadressierung finden Sie unter Texturadressierungsmodi (Direct3D 9).

Verdrängungskartenumbruch

Verdrängungszuordnungen werden von der Tesselations-Engine interpoliert. Da der Umbruchmodus für die Tessellations-Engine nicht angegeben werden kann, kann die Texturumbruchung nicht mit Verdrängungszuordnungen ausgeführt werden. Eine Anwendung kann eine Reihe von Scheitelpunkten verwenden, die die Interpolation in beliebige Richtungen umschließen. Die Anwendung kann auch die zu tunde Interpolation als einfache lineare Interpolation angeben.

Direct3D-Texturen