Textursampling-Features für Streamingressourcen
Die Textursamplingfeatures von Streamingressourcen umfassen das Abrufen von Shaderstatusfeedback zu zugeordneten Bereichen, überprüfen, ob alle Daten, auf die zugegriffen wird, in der Ressource zugeordnet wurde, Klammern, um Shadern dabei zu helfen, Bereiche in Mipmappen-Streamingressourcen zu vermeiden, die als nicht zugeordnet bekannt sind, und zu ermitteln, was die minimale LOD, die für einen vollständigen Texturfilterabdruck zugeordnet ist, zu ermitteln.
Anforderungen an Textursamplingfeatures für Streamingressourcen
Die hier beschriebenen Textursamplingfeatures erfordern Unterstützung der Ebene 2 von Streamingressourcen.
Feedback zum Shaderstatus zu zugeordneten Bereichen
Jede Shaderanweisung, die eine Streamingressource liest und/oder schreibt, bewirkt, dass Statusinformationen aufgezeichnet werden. Dieser Status wird als optionaler zusätzlicher Rückgabewert für jede Ressourcenzugriffsanweisung verfügbar gemacht, die in ein 32-Bit-Temp-Register wechselt. Der Inhalt des Rückgabewerts ist undurchsichtig. Das heißt, direktes Lesen durch das Shaderprogramm ist unzulässig. Sie können jedoch die CheckAccessFullyMapped-Funktion verwenden, um die Statusinformationen zu extrahieren.
Vollständig zugeordnete Prüfung
Die CheckAccessFullyMapped-Funktion interpretiert den Status, der von einem Speicherzugriff zurückgegeben wird, und gibt an, ob alle Daten, auf die zugegriffen wird, in der Ressource zugeordnet wurden. CheckAccessFullyMapped gibt true (0xFFFFFFFF) zurück, wenn Daten zugeordnet oder falsch (0x00000000) zugeordnet wurden, wenn die Daten nicht zugeordnet wurden.
Bei Filtervorgängen liegt manchmal die Gewichtung eines bestimmten Texels bei 0,0. Ein Beispiel ist ein lineares Beispiel mit Texturkoordinaten, die direkt auf eine Texelmitte fallen: 3 andere Texel (welche sie je nach Hardware variieren können) tragen zum Filter bei, aber mit einer Gewichtung von 0. 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 die gleiche Garantie für Texturfilter, die mehrere Mip-Ebenen enthalten; Wenn die Texel auf einem der Mipmaps nicht zugeordnet sind, aber die Gewichtung dieser Texel 0 ist, zählen diese Texel nicht als nicht zugeordneter Zugriff.
Beim Sampling aus einem Format mit weniger als 4 Komponenten (z. B. DXGI_FORMAT_R8_UNORM) führen alle Texel, die auf NULL-Kacheln fallen, dazu, dass ein ZUGEORDNETer NULL-Zugriff gemeldet wird, unabhängig davon, welche Komponenten der Shader tatsächlich im Ergebnis betrachtet. Beispielsweise würde das Lesen von R8_UNORM und das Maskieren des Leseergebnisses im Shader mit .gba/.yzw nicht scheinen, die Textur überhaupt zu lesen. Wenn die Texeladresse jedoch eine zugeordnete NULL-Kachel ist, zählt der Vorgang weiterhin als NULL-Zuordnungszugriff.
Der Shader kann den Status überprüfen und jeden gewünschten Handlungsverlauf bei Fehlern verfolgen. Beispielsweise kann ein Handlungsverlauf "Misses" (z. B. über UAV-Schreibzugriff) protokolliert und/oder ein anderes Leseelement, das an einen groberen LOD geklammert wird, der zugeordnet werden kann. 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 besteht nicht darin, dass der genaue Satz von Kacheln gemeldet wird, auf die zugegriffen würde. Die Anwendung kann konservative Vermutungen basierend auf der Kenntnis der koordinaten machen, die sie für den Zugriff verwendet hat, sowie die Verwendung der LOD-Anweisung; Beispielsweise gibt tex2Dlod) die Hardware-LOD-Berechnung zurück.
Eine weitere Komplikation besteht darin, dass viele Zugriffe auf die gleichen Kacheln vorhanden sind, sodass viele redundante Protokollierungen auftreten und möglicherweise über den Arbeitsspeicher verfügen. Es könnte praktisch sein, wenn die Hardware die Möglichkeit erhalten könnte, Kachelzugriffe nicht zu melden, wenn sie zuvor an anderer Stelle gemeldet wurden. Vielleicht könnte der Status dieser Nachverfolgung aus der API zurückgesetzt werden (wahrscheinlich an Framegrenzen).
MinLOD-Klemme pro Beispiel
Um Shadern dabei zu helfen, Bereiche in Mipmapped-Streamingressourcen zu vermeiden, die als nicht zugeordnet bekannt sind, weisen die meisten Shaderanweisungen, die die Verwendung eines Samplers (Filtern) umfassen, einen Modus auf, der es dem Shader ermöglicht, einen zusätzlichen Float32 MinLOD-Clampparameter an das Texturbeispiel zu übergeben. Dieser Wert befindet sich im Mipmap-Nummernbereich der Ansicht im Gegensatz zur zugrunde liegenden Ressource.
Die Hardware führtmax(fShaderMinLODClamp,fComputedLOD)
an derselben Stelle in der LOD-Berechnung aus, bei der die MinLOD-Klammer pro Ressource auftritt, was auch ein Max() ist.
Wenn das Ergebnis der Anwendung der LOD-Klammer pro Stichprobe und aller anderen im Sampler definierten LOD-Klammern ein leerer Satz ist, entspricht das Ergebnis dem Zugriffsergebnis pro Ressource wie die minLOD-Klammer pro Ressource: 0 für Komponenten im Oberflächenformat und Standardwerte für fehlende Komponenten.
Die LOD-Anweisung (z . B. tex2Dlod), die die hier beschriebene MinLOD-Klemme pro Probe vorgibt, gibt sowohl eine geklemmte als auch eine unverlampete LOD zurück. Die von dieser LOD-Anweisung zurückgegebene geklammerte LOD-Anweisung spiegelt alle Klammern einschließlich der Pro-Ressourcen-Klemme wider, aber keine Pro-Sample-Klemme. Die Klammer pro Beispiel wird trotzdem vom Shader gesteuert und bekannt, sodass der Shaderautor diese Klammer 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, um Informationen für jede Kachel in einer Streamingressource zu speichern. Möglicherweise speichert man die erste LOD, die an einer bestimmten Kachelposition zugeordnet ist. Durch sorgfältiges Sampling dieser Datenstruktur auf ähnliche Weise wie bei der Streamingressource kann man ermitteln, was die minimale LOD, die für einen vollständigen Texturfilterbedarf zugeordnet ist, vollständig zugeordnet ist. Um diesen Prozess zu vereinfachen, führt Direct3D 11.2 einen neuen allgemeinen Samplermodus ein, min/max. Filterung.
Das Dienstprogramm 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 Texeln abruft, den ein normaler Texturfilter abruft. Anstatt jedoch die Werte zu mischen, um eine Antwort zu erzeugen, gibt sie die min() oder max() der abgerufenen Texel pro Komponente (z. B. das Min aller R-Werte getrennt vom Min aller G-Werte usw.) zurück.
Die Min/Max-Vorgänge folgen Direct3D-Arithmetischen Genauigkeitsregeln. Die Reihenfolge der Vergleiche spielt keine Rolle.
Bei Filtervorgängen, die nicht min/max sind, liegt manchmal die Gewichtung eines bestimmten Texel bei 0,0. Ein Beispiel ist ein lineares Beispiel mit Texturkoordinaten, die direkt auf eine Texelmitte fallen; in diesem Fall tragen 3 andere Texel (welche sie sind, je nach Hardware variieren können) zum Filter bei, aber mit 0 Gewicht. Bei einem dieser Texel, die eine Gewichtung von 0 auf einem Nicht-Min/Max-Filter haben, tragen diese Texel immer noch nicht zum Ergebnis bei (und die Gewichte wirken sich andernfalls nicht auf den Min/Max-Filtervorgang aus).
Die Unterstützung für dieses Feature hängt von der Unterstützung der Stufe 2 für Streamingressourcen ab.
Verwandte Themen
Pipelinezugriff auf Streamingressourcen