Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Anwendungen müssen keine Texturfilterung verwenden. Direct3D kann so eingestellt werden, dass es die Texeladresse berechnet, wobei das Ergebnis häufig keine ganze Zahl ist, und die Farbe des Texels kopiert, das die nächstgelegene ganzzahlige Adresse hat. Dieser Prozess wird als nächster-Punkt-Samplingbezeichnet. Das Sampling am nächsten Punkt kann so sein, als ob die Größe der Textur mit der Größe des Bilds des Grundtyps auf dem Bildschirm vergleichbar ist. Andernfalls muss die Textur vergrößert oder verkleinert werden. Das Ergebnis einer nicht übereinstimmenden Texturgröße mit der ursprünglichen Bildgröße kann ein blockiges, aliasiertes oder verschwommenes Bild sein.
Verwenden Sie das Sampling am nächstgelegenen Punkt sorgfältig, da es manchmal zu Grafikartefakten führen kann, wenn die Textur an der Grenze zwischen zwei Texeln bemustert wird. Diese Grenze ist die Position entlang der Textur (u oder v), an der der abgetastete Texel von einem Texel zum nächsten übergeht. Wenn Punktsampling verwendet wird, wählt das System entweder das eine oder das andere Texel aus, und das Ergebnis kann sich abrupt von einem Texel zum nächsten ändern, wenn die Grenze überschritten wird. Dieser Effekt kann als unerwünschte Grafikartefakte in der angezeigten Textur angezeigt werden. Wenn lineare Filterung verwendet wird, wird das resultierende Texel aus den benachbarten Texeln berechnet und fließend zwischen ihnen überblendet, während sich der Texturindex durch die Grenze bewegt.
Dieser Effekt kann beim Zuordnen einer sehr kleinen Textur zu einem sehr großen Polygon gesehen werden: ein Vorgang, der häufig als Vergrößerung bezeichnet wird. Wenn Sie z. B. eine Textur verwenden, die wie ein Häkchen aussieht, führt das Sampling am nächsten Punkt zu einem größeren Checkerboard, das unterschiedliche Kanten anzeigt. Im Gegensatz dazu führt die lineare Texturfilterung zu einem Bild, bei dem die Checkerboardfarben gleichmäßig über das Polygon variieren.
In den meisten Fällen erhalten Anwendungen die besten Ergebnisse, indem sie die nächstgelegene Punktabtastung möglichst vermeiden. Der Großteil der heutigen Hardware wurde für die lineare Filterung optimiert, sodass Ihre Anwendung keine Leistungseinbußen erleiden sollte. Wenn der gewünschte Effekt unbedingt die Verwendung des Samplings am nächstgelegenen Punkt erfordert , z. B. bei Verwendung von Texturen zum Anzeigen lesbarer Textzeichen, sollte Ihre Anwendung äußerst vorsichtig sein, um das Sampling an den Texelgrenzen zu vermeiden, was zu unerwünschten Effekten führen kann. Die folgende Abbildung zeigt, wie diese Artefakte aussehen können.
Die beiden Quadrate oben rechts in der Gruppe erscheinen anders als ihre Nachbarn, wobei diagonale Offsets durch sie verlaufen. Um Grafikartefakte wie diese zu vermeiden, müssen Sie mit den Direct3D-Textursamplingregeln für Nearest-Point-Filterung vertraut sein. Direct3D ordnet eine Gleitkomma-Texturkoordinate im Bereich von [0,0 bis 1,0] (einschließlich 0,0 und 1,0) einem ganzzahligen Texelraumwert im Bereich von [-0,5 bis n-0,5] zu, wobei n die Anzahl der Texel in einer bestimmten Dimension der Textur ist. Der resultierende Texturindex wird auf die nächste ganze Zahl gerundet. Diese Zuordnung kann zu Stichprobenungenauigkeiten an den Texelgrenzen führen.
Stellen Sie sich für ein einfaches Beispiel eine Anwendung vor, die Polygone mit dem Wrap-Texturadressierungsmodus rendert. Mithilfe der von Direct3D verwendeten Abbildung wird der u-Texturindex wie im folgenden Diagramm für eine Textur mit einer Breite von 4 Texeln dargestellt.
Die Texturkoordinaten, 0,0 und 1,0 für diese Abbildung, befinden sich genau an der Grenze zwischen Texeln. Unter Verwendung der Methode, mit der Direct3D Werte zuordnet, reichen die Texturkoordinaten von [-0,5 bis 4 - 0,5], wobei 4 die Breite der Textur ist. In diesem Fall ist der gesampelte Texel der Texel 0 für einen Texturindex von 1.0. Wenn die Texturkoordinate jedoch nur etwas kleiner als 1,0 war, wäre das beispielierte Texel das n-Texel anstelle des 0-Texel.
Die Implikation davon ist, dass die Vergrößerung einer kleinen Textur mit Texturkoordinaten von genau 0,0 und 1,0 mit der nächstliegenden Punktfilterung auf einem bildraumausgerichteten Dreieck zu Pixeln führt, bei denen die Texturkarte an der Grenze zwischen Texeln abgetastet wird. Alle Ungenauigkeiten bei der Berechnung von Texturkoordinaten, wie klein auch immer, führen zu Artefakten entlang der Bereiche im gerenderten Bild, die den Texel-Kanten der Texturkarte entsprechen.
Das Abbilden von Gleitkommazahl-Texturkoordinaten zu ganzzahligen Texeln mit perfekter Genauigkeit ist schwierig, rechenintensiv und im Allgemeinen nicht erforderlich. Die meisten Hardwareimplementierungen verwenden einen iterativen Ansatz zum Berechnen von Texturkoordinaten an jeder Pixelposition innerhalb eines Dreiecks. Iterative Ansätze neigen dazu, diese Ungenauigkeiten auszublenden, da die Fehler während der Iteration gleichmäßig angesammelt werden.
Der Direct3D-Referenzrasterizer verwendet einen Ansatz der direkten Bewertung, um Texturindizes an jedem Pixel zu berechnen. Die direkte Auswertung unterscheidet sich vom iterativen Ansatz darin, dass jede Ingenauigkeit im Vorgang eine zufälligere Fehlerverteilung aufweist. Das Ergebnis ist, dass die Samplingfehler, die an den Grenzen auftreten, spürbarer sein können, da der Referenzrasterizer diesen Vorgang nicht mit perfekter Genauigkeit ausführt.
Der beste Ansatz besteht darin, die Filterung am nächstgelegenen Punkt nur bei Bedarf zu verwenden. Wenn Sie es verwenden müssen, wird empfohlen, die Texturkoordinaten leicht von den Randpositionen zu versetzen, um Artefakte zu vermeiden.
Verwandte Themen