Freigeben über


Textursampling-Features für Streamingressourcen

Zu den Features für die Textur sampling von Streamingressourcen gehören das Abrufen von Shader-status Feedback zu zugeordneten Bereichen, die Überprüfung, ob alle Daten, auf die zugegriffen wird, in der Ressource zugeordnet wurden, das Spannen, um Shadern dabei zu helfen, Bereiche in mipmappenbasierten Streamingressourcen zu vermeiden, von denen bekannt ist, dass sie nicht zugeordnet sind, und ermitteln, was die minimale LOD ist, die vollständig für einen gesamten Texturfilterabdruck zugeordnet ist.

Anforderungen an Texture Sampling-Features für Streamingressourcen

Für die hier beschriebenen Textursamplingsfeatures ist die Unterstützung von Streamingressourcen der Ebene 2 erforderlich.

Shader status Feedback zu zugeordneten Bereichen

Jede Shaderanweisung, die eine Streamingressource liest und/oder schreibt, führt dazu, dass status Informationen aufgezeichnet werden. Dieser status wird als optionaler zusätzlicher Rückgabewert für jede Ressourcenzugriffsanweisung verfügbar gemacht, die in ein temporäres 32-Bit-Register fließt. Der Inhalt des Rückgabewerts ist undurchsichtig. Das heißt, das direkte Lesen durch das Shaderprogramm ist nicht zulässig. Sie können jedoch die CheckAccessFullyMapped-Funktion verwenden, um die status Informationen zu extrahieren.

Vollständig zugeordnete Überprüfung

Die Funktion CheckAccessFullyMapped interpretiert die von einem Speicherzugriff zurückgegebenen status und gibt an, ob alle Daten, auf die zugegriffen wird, in der Ressource zugeordnet wurden. CheckAccessFullyMapped gibt true (0xFFFFFFFF) zurück, wenn Daten zugeordnet wurden, oder false (0x00000000), wenn Die Daten nicht zugeordnet wurden.

Bei Filtervorgängen ist die Gewichtung eines bestimmten Texels manchmal 0,0. Ein Beispiel ist ein lineares Beispiel mit Texturkoordinaten, die direkt auf einen Texel-Mittelpunkt fallen: 3 andere Texel (welche sie sind je nach Hardware variieren) tragen zum Filter bei, aber mit 0 Gewicht. Diese 0-Gewichtungs-Texel tragen überhaupt nicht zum Filterergebnis bei. Wenn sie also auf NULL-Kacheln fallen, zählen sie nicht als nicht zugeordneter Zugriff. Beachten Sie, dass die gleiche Garantie für Texturfilter gilt, die mehrere MIP-Ebenen enthalten. Wenn die Texels auf einer der mipmaps nicht zugeordnet sind, aber die Gewichtung auf diesen Texels 0 ist, zählen diese Texels nicht als nicht zugeordneter Zugriff.

Beim Sampling aus einem Format mit weniger als 4 Komponenten (z. B. DXGI_FORMAT_R8_UNORM) führen alle Texels, die auf NULL-Kacheln fallen, dazu, dass ein NULL-zugeordneter Zugriff gemeldet wird, unabhängig davon, welche Komponenten der Shader im Ergebnis tatsächlich betrachtet. Das Lesen aus R8_UNORM und das Maskieren des Leseergebnisses im Shader mit .gba/.yzw würde beispielsweise die Textur überhaupt nicht lesen müssen. Wenn die texel-Adresse jedoch eine NULL zugeordnete Kachel ist, gilt der Vorgang weiterhin als NULL-Zuordnungszugriff.

Der Shader kann die status überprüfen und alle gewünschten Maßnahmen bei Fehlern verfolgen. Beispielsweise kann eine Vorgehensweise das Protokollieren von "Fehlvorgängen" (z. B. über UAV-Schreibvorgänge) und/oder das Ausgeben eines anderen Lesevorgangs sein, der an eine gröbere LOD geklemmt ist, von der bekannt ist, dass sie zugeordnet wird. Eine Anwendung möchte möglicherweise auch erfolgreiche Zugriffe nachverfolgen, um einen Eindruck davon zu erhalten, auf welchen Teil der zugeordneten Kacheln zugegriffen wurde.

Eine Komplikation für die Protokollierung ist, dass kein Mechanismus zum Melden der genauen Gruppe von Kacheln vorhanden ist, auf die zugegriffen worden wäre. Die Anwendung kann konservative Schätzungen basierend auf der Kenntnis der Koordinaten, die sie für den Zugriff verwendet hat, sowie auf der Verwendung der LOD-Anweisung treffen. beispielsweise gibt tex2Dlod) die Hardware-LOD-Berechnung zurück.

Eine weitere Komplikation besteht darin, dass viele Zugriffe auf dieselben Kacheln erfolgen, sodass viel redundante Protokollierung und möglicherweise Konflikte im Arbeitsspeicher auftreten. Es könnte praktisch sein, wenn der Hardware die Möglichkeit gegeben werden könnte, Kachelzugriffe nicht zu melden, wenn sie zuvor an anderer Stelle gemeldet wurden. Möglicherweise kann der Status einer solchen Nachverfolgung von der API zurückgesetzt werden (wahrscheinlich an Framegrenzen).

MinLOD-Klemme pro Beispiel

Damit Shader Bereiche in mipmapped-Streamingressourcen vermeiden können, die bekanntermaßen nicht zugeordnet sind, verfügen die meisten Shaderanweisungen, die einen Sampler (Filterung) beinhalten, über einen Modus, der es dem Shader ermöglicht, einen zusätzlichen float32-MinLOD-Klemmparameter an das Texturbeispiel zu übergeben. Dieser Wert befindet sich im MIPMAP-Nummernbereich der Ansicht, im Gegensatz zur zugrunde liegenden Ressource.

Die Hardware wird an der gleichen Stelle in der LOD-Berechnung ausgeführtmax(fShaderMinLODClamp,fComputedLOD), an der die MinLOD-Klemme pro Ressource auftritt, die ebenfalls ein max() ist.

Wenn das Ergebnis des Anwendens der LOD-Klemme pro Stichprobe und aller anderen im Sampler definierten LOD-Klammern ein leerer Satz ist, ist das Ergebnis das gleiche Out-of-Bounds-Zugriffsergebnis wie die minLOD-Klemme pro Ressource: 0 für Komponenten im Oberflächenformat und Standardwerte für fehlende Komponenten.

Die LOD-Anweisung (z. B . tex2Dlod), die vor der hier beschriebenen minLOD-Klemme pro Beispiel zurückgestellt ist, gibt sowohl einen gespannten als auch einen unbelampenten LOD zurück. Die von dieser LOD-Anweisung zurückgegebene klemmte LOD spiegelt die gesamte Klemmung einschließlich der Pro-Ressourcen-Klemme wider, aber nicht eine Pro-Sample-Klemme. Die Pro-Beispiel-Klemme wird ohnehin vom Shader gesteuert und bekannt, sodass der Shaderautor diese Klemme bei Bedarf manuell auf den Rückgabewert der LOD-Anweisung anwenden kann.

Min/Max-Reduzierungsfilterung

Anwendungen können ihre eigenen Datenstrukturen verwalten, die sie darüber informieren, wie die Zuordnungen für eine Streamingressource aussehen. Ein Beispiel wäre eine Oberfläche, die einen Texel enthält, der Informationen für jede Kachel in einer Streamingressource enthält. Die erste LOD, die an einer bestimmten Kachelposition zugeordnet ist, kann gespeichert werden. Durch sorgfältiges Sampling dieser Datenstruktur in einer ähnlichen Weise wie die Streamingressource, die für die Stichprobe vorgesehen ist, kann man herausfinden, was die minimale LOD ist, die vollständig für einen gesamten Texturfilterabdruck zugeordnet ist. Um diesen Prozess zu vereinfachen, führt Direct3D 11.2 einen neuen universellen Samplermodus ein, die Min/Max-Filterung.

Das Hilfsprogramm der Min/Max-Filterung für die LOD-Nachverfolgung kann für andere Zwecke nützlich sein, z. B. für die Filterung von Tiefenoberflächen.

Die Min/Max-Reduzierungsfilterung ist ein Modus für Sampler, der den gleichen Satz von Texels abruft, den ein normaler Texturfilter abrufen würde. Anstatt jedoch die Werte zu mischen, um eine Antwort zu erzeugen, gibt er die min() oder max() der abgerufenen Texels pro Komponente zurück (z. B. das min aller R-Werte, getrennt von der min aller G-Werte usw.).

Die min/max-Vorgänge folgen Direct3D-Arithmetikgenauigkeitsregeln. Die Reihenfolge der Vergleiche spielt keine Rolle.

Bei Filtervorgängen, die nicht min/max sind, beträgt die Gewichtung eines bestimmten Texels manchmal 0,0. Ein Beispiel ist ein lineares Beispiel mit Texturkoordinaten, die direkt auf ein Texelzentrum fallen. in diesem Fall tragen 3 andere Texel (welche sie sind, kann je nach Hardware variieren) zum Filter bei, aber mit 0 Gewicht. Wenn der Filter min/max ist, tragen diese Texel für eines dieser Texels, die für einen Filter mit nicht min/max 0 gewichten würden, immer noch nicht zum Ergebnis bei (und die Gewichtungen wirken sich andernfalls nicht auf den Min/Max-Filtervorgang aus).

Die Unterstützung für dieses Feature hängt von der Unterstützung der Ebene 2 für Streamingressourcen ab.

Pipelinezugriff auf Streamingressourcen