Freigeben über


Sampling am nächstgelegenen Punkt

Anwendungen müssen keine Texturfilterung verwenden. Direct3D kann so festgelegt werden, dass die Texeladresse berechnet wird, die häufig nicht als ganze Zahlen ausgewertet wird, und die Farbe des Texels mit der nächstgelegenen ganzzahligen Adresse kopiert. Dieser Vorgang wird als Sampling am nächstgelegenen Punkt bezeichnet. 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 zu primitiven Bildgrößen 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 stichprobenierte Texel von einem Texel zum nächsten übergeht. Wenn Punktsampling verwendet wird, wählt das System ein Beispiel-Texel oder das andere aus, und das Ergebnis kann sich abrupt von einem Texel zum nächsten Texel ändern, während die Grenze überschritten wird. Dieser Effekt kann als unerwünschte Grafikartefakte in der angezeigten Textur angezeigt werden. Wenn die lineare Filterung verwendet wird, wird das resultierende Texel sowohl von benachbarten Texeln als auch glatten Mischungen zwischen ihnen berechnet, während der Texturindex durch die Grenze bewegt wird.

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 möglichst ein Beispiel für den nächstgelegenen Punkt vermeiden. Der Großteil der Hardware ist heute für die lineare Filterung optimiert, sodass Ihre Anwendung keine beeinträchtigte Leistung beeinträchtigen 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.

Abbildung eines sechsteiligen Felds mit nicht zusammenhängenden horizontalen Linien in den beiden oberen rechten Quadraten

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 Direct3D-Textursamplingregeln für die Filterung am nächsten Punkt vertraut sein. Direct3D ordnet eine Gleitkommatextkoordinate zwischen [0,0, 1,0] (0,0 und einschließlich 1,0) zu einem ganzzahligen Texelraumwert zwischen [ - 0,5, 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 Sampling-Ungenauigkeiten an Texelgrenzen einführen.

Stellen Sie sich für ein einfaches Beispiel eine Anwendung vor, die Polygone mit dem Wrap-Texturadressierungsmodus rendert. Mithilfe der von Direct3D verwendeten Zuordnung wird der U-Texturindex wie im folgenden Diagramm für eine Textur mit einer Breite von 4 Texeln dargestellt.

Diagramm der Texturkoordinaten 0,0 und 1,0 an der Grenze zwischen Texeln

Die Texturkoordinaten, 0,0 und 1,0 für diese Abbildung, befinden sich genau an der Grenze zwischen Texeln. Mit der Methode, mit der Direct3D Werte zuordnet, reichen die Texturkoordinaten von [ - 0,5, 4 - 0,5], wobei 4 die Breite der Textur ist. In diesem Fall ist das beispielweise Texel der 0 Texel 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.

Dies ist der Fall, dass die Vergrößerung einer kleinen Textur mit Texturkoordinaten von genau 0,0 und 1,0 mit der Filterung am nächstgelegenen Punkt auf einem bildschirmbereich ausgerichteten Dreieck zu Pixeln führt, für die die Texturzuordnung an der Grenze zwischen Texeln beispielt wird. Alle Ungenauigkeiten bei der Berechnung von Texturkoordinaten, jedoch klein, führen zu Artefakten entlang der Bereiche im gerenderten Bild, die den Texelrändern der Texturzuordnung entsprechen.

Das Durchführen dieser Zuordnung von Gleitkommatextkoordinaten zu ganzzahligen Texeln mit perfekter Genauigkeit ist schwierig, rechenaufwendig 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 Direct-Evaluation-Ansatz zum Berechnen von Texturindizes an jeder Pixelposition. 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, empfiehlt es sich, Texturkoordinaten leicht von den Grenzpositionen zu versatz, um Artefakte zu vermeiden.

Texturfilterung