Freigeben über


Textursamplingfunktionen für gekachelte Ressourcen

In diesem Abschnitt werden die Texturensamplingfeatures für gekachelte Ressourcen beschrieben.

Anforderungen an texturierte Stichprobenfunktionen für gekachelte Ressourcen

Für die hier beschriebenen Textursamplingsfeatures ist die Unterstützung der Ebene 2 der gekachelten Ressourcen erforderlich.

Shaderfeedback zu zugeordneten Bereichen

Jede Shaderanweisung, die eine gekachelte Ressource 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 Texel, 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 (z. B . tex2Dlod) treffen, die die Hardware-LOD-Berechnung zurückgibt.

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 mit mipmapped gekachelten Ressourcen vermeiden können, die bekanntermaßen nicht zugeordnet sind, verfügen die meisten Shaderanweisungen, die einen Sampler (Filterung) beinhalten, über einen neuen 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 führt max(fShaderMinLODClamp,fComputedLOD) an der gleichen Stelle in der LOD-Berechnung durch, an der die MinLOD-Klemme pro Ressource auftritt, was auch 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 gekachelte Ressource aussehen. Ein Beispiel wäre eine Oberfläche, die einen Texel enthält, der Informationen für jede Kachel in einer gekachelten Ressource 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 gekachelte Ressource, die für die Stichprobe vorgesehen ist, kann man herausfinden, wie die minimale LOD, die vollständig für einen gesamten Texturfilterabdruck zugeordnet ist, sein wird. 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 einen Texel-Mittelpunkt fallen - 3 andere Texel (welche sie sind je nach Hardware variieren) tragen 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 vollständige Liste der Filtermodi wird in der D3D11_FILTER-Enumeration mit MINIMUM und MAXIMUM in den Enumerationswerten angezeigt.

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

Pipelinezugriff auf gekachelte Ressourcen