Freigeben über


Nearest-Point Sampling (Direct3D 9)

Anwendungen müssen keine Texturfilterung verwenden. Direct3D kann so festgelegt werden, dass die Texel-Adresse berechnet wird, die häufig nicht in ganze Zahlen ausgewertet wird, und die Farbe des Texel mit der nächstgelegenen ganzzahligen Adresse kopiert wird. Dieser Prozess wird als Nächste-Punkt-Stichprobenentnahme bezeichnet. Dies kann eine schnelle und effiziente Methode zum Verarbeiten von Texturen sein, wenn die Größe der Textur der Größe des Grundbilds auf dem Bildschirm ähnelt. Andernfalls muss die Textur vergrößert oder verkleinert werden. Das Ergebnis kann ein klobiges, aliasiertes oder unscharfes Bild sein.

Ihre C++-Anwendung kann die Stichprobenentnahme für den nächsten Punkt auswählen, indem sie die IDirect3DDevice9::SetSamplerState-Methode aufruft . Legen Sie den Wert des ersten Parameters auf die ganzzahlige Indexnummer (0-7) der Textur fest, für die Sie eine Texturfiltermethode auswählen. Übergeben Sie D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER oder D3DSAMP_MIPFILTER für den zweiten Parameter, um den Vergrößerungs-, Verknappungs- oder Mipmapping-Filter festzulegen. Übergeben Sie D3DTEXF_POINT im dritten Parameter.

Sie sollten die Stichprobenentnahme am nächstgelegenen Punkt sorgfältig verwenden, da dies manchmal zu grafischen Artefakten führen kann, wenn die Textur an der Grenze zwischen zwei Texels abgetastet wird. Diese Grenze ist die Position entlang der Textur (u oder v), an der der stichprobenierte Texel von einem Texel zum nächsten wechselt. Wenn die Punktentnahme verwendet wird, wählt das System ein oder das andere Beispiel texel aus, und das Ergebnis kann sich abrupt von einem Texel zum nächsten Texel ändern, wenn 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 aus beiden benachbarten Texeln berechnet und fügt sich nahtlos zwischen ihnen zusammen, wenn sich der Texturindex durch die Grenze bewegt.

Dieser Effekt kann bei der Zuordnung einer sehr kleinen Textur auf ein sehr großes Polygon gesehen werden: ein Vorgang, der häufig als Vergrößerung bezeichnet wird. Wenn Sie beispielsweise eine Textur verwenden, die wie ein Schachbrett aussieht, führt die Stichprobenentnahme am nächsten Punkt zu einem größeren Schachbrett, das unterschiedliche Kanten aufweist. Im Gegensatz dazu führt die lineare Texturfilterung zu einem Bild, in dem die Schachbrettfarben gleichmäßig über das Polygon variieren.

In den meisten Fällen erzielen Anwendungen die besten Ergebnisse, indem sie möglichst keine stichprobennächsten Punkte vermeiden. Der Großteil der Heutigen Hardware ist für die lineare Filterung optimiert, sodass ihre Anwendung keine Leistungseinbußen erleiden sollte. Wenn der gewünschte Effekt unbedingt die Verwendung der Stichprobenentnahme am nächsten Punkt erfordert - z. B. bei Verwendung von Texturen zum Anzeigen lesbarer Textzeichen -, sollte Ihre Anwendung äußerst vorsichtig sein, um stichprobenartig 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

Beachten Sie, dass die beiden Quadrate oben rechts in der Gruppe anders aussehen als ihre Nachbarn, wobei diagonale Offsets durch sie verlaufen. Um grafische Artefakte wie diese zu vermeiden, müssen Sie mit Direct3D-Textur sampling-Regeln für die Filterung des nächstgelegenen Punkts vertraut sein. Direct3D ordnet eine Gleitkommatexturkoordinate von [0,0, 1,0] (0,0 bis einschließlich 1,0) einem ganzzahligen Texelraumwert zu, der von [ - 0,5, n - 0,5] reicht, wobei n die Anzahl von Texels in einer bestimmten Dimension für die Textur ist. Der resultierende Texturindex wird auf die nächste ganze Zahl gerundet. Diese Zuordnung kann zu Stichprobenungenauigkeiten an Texelgrenzen führen.

Stellen Sie sich als einfaches Beispiel eine Anwendung vor, die Polygone mit dem D3DTADDRESS_WRAP Texturadressierungsmodus rendert. Unter Verwendung der von Direct3D verwendeten Zuordnung wird der u-Texturindex wie im folgenden Diagramm für eine Textur mit einer Breite von 4 Texels dargestellt.

Diagramm der Texturkoordinaten 0.0 und 1.0 an der Grenze zwischen Texels

Beachten Sie, dass sich die Texturkoordinaten 0,0 und 1,0 für diese Abbildung genau an der Grenze zwischen Texels befinden. Bei Verwendung der Methode, mit der Direct3D-Werte zugeordnet werden, liegen die Texturkoordinaten von [ - 0,5, 4 - 0,5], wobei 4 die Breite der Textur ist. In diesem Fall ist der stichprobenierte Texel der 0 Texel für einen Texturindex von 1,0. Wenn die Texturkoordinate jedoch nur geringfügig kleiner als 1,0 ist, wäre der stichprobenierte Texel das n texel anstelle des Texel 0.

Dies hat zur Folge, dass die Vergrößerung einer kleinen Textur mit Texturkoordinaten von genau 0,0 und 1,0 mit Der Nächstenpunktfilterung auf einem bildschirmraumorientierten Dreieck zu Pixeln führt, für die die Texturkarte an der Grenze zwischen Texeln abgetastet wird. Alle Ungenauigkeiten bei der Berechnung der Texturkoordinaten, noch so klein, führen zu Artefakten entlang der Bereiche im gerenderten Bild, die den Texelrändern der Texturkarte entsprechen.

Diese Zuordnung von Gleitkommatexturkoordinaten zu ganzzahligen Texeln mit perfekter Genauigkeit ist schwierig, rechenintensiv und in der Regel 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 zu verbergen, da die Fehler während der Iteration gleichmäßig kumuliert werden.

Der Direct3D-Referenzrasterer verwendet einen Direkten Auswertungsansatz zum Berechnen von Texturindizes an jeder Pixelposition. Die direkte Auswertung unterscheidet sich vom iterativen Ansatz dadurch, dass jede Ungenauigkeit im Vorgang eine eher zufällige Fehlerverteilung aufweist. Dies hat zur Folge, dass die Stichprobenfehler, die an den Grenzen auftreten, auffälliger sein können, da der Verweisrasterer diesen Vorgang nicht mit perfekter Genauigkeit ausführt.

Der beste Ansatz besteht darin, die Nächstgelegene Punktfilterung nur bei Bedarf zu verwenden. Wenn Sie es verwenden müssen, wird empfohlen, Texturkoordinaten leicht von den Begrenzungspositionen zu verrechnen, um Artefakte zu vermeiden.

Texturfilterung