Prädikation

Die Prädication ist ein Feature, das es der GPU und nicht der CPU ermöglicht, zu bestimmen, ob ein Objekt nicht gezeichnet, kopiert oder verteilt wird.

Übersicht

Die typische Verwendung von Prädikation ist mit Okklusion; wenn ein Begrenzungsrahmen gezeichnet und verdeckt wird, hat es offensichtlich keinen Sinn, das Objekt selbst zu zeichnen. In diesem Fall kann die Zeichnung des Objekts "prädiziert" werden, sodass es aus dem tatsächlichen Rendering durch die GPU entfernt wird.

Auf den ersten Blick scheint dies über den Standardtiefentest und einen frühen Tiefendurchlauf hinaus redudant zu erscheinen. Die Prädication kann jedoch den Mehraufwand des Zeichnungsbefehlszustands selbst sowie die Rasterung entfernen. Während ein früher Tiefendurchlauf unnötige Pixel entfernt, kann er dennoch Vertex-, Hull-, Domain- und Geometry-Shader ausführen und den Eingabeassesor, tesselator und Rasterizer mit fester Funktion aufrufen. Durch das Zeichnen eines einfachen Begrenzungsrahmens oder eines ähnlichen Begrenzungsvolumens, das einfacher zu verarbeiten und zu rastern ist als das reale Modell, vermeiden Sie unnötige Rasterung und Verarbeitung.

Im Gegensatz zu Direct3D 11 ist die Prädication von Abfragen entkoppelt und in Direct3D 12 erweitert, um es einer Anwendung zu ermöglichen, Objekte basierend auf allen Gründen zu prädikatieren, für die sich der App-Entwickler entscheiden kann (nicht nur okklusion).

SetPredication

Die Prädication kann basierend auf dem Wert von 64-Bits innerhalb eines Puffers festgelegt werden (siehe D3D12_PREDICATION_OP).

Wenn die GPU einen SetPredication-Befehl ausführt, wird der Wert im Puffer angedockt. Zukünftige Änderungen an den Daten im Puffer wirken sich nicht rückwirkend auf den Prädicationszustand aus.

Wenn der Eingabeparameter Buffer NULL ist, ist die Prädication deaktiviert.

Prädication-Hinweise sind in der Direct3D 12-API nicht vorhanden. und die Prädication ist für Direct-, Compute- und Kopierbefehlslisten zulässig. Der Quellpuffer kann sich in einem beliebigen Heaptyp befinden (Standard, Upload, Readback, benutzerdefiniert).

Die Core Runtime überprüft Folgendes:

  • AlignedBufferOffset ist ein Vielfaches von 8 Byte.
  • Die Ressource ist ein Puffer.
  • Der Vorgang ist ein gültiges Element der -Enumeration.
  • SetPredication kann nicht innerhalb eines Bundles aufgerufen werden.
  • Der Befehlslistentyp unterstützt die Prädication.
  • Der Offset überschreitet die Puffergröße nicht.

Die Debugebene gibt einen Fehler aus, wenn sich der Quellpuffer nicht im D3D12_RESOURCE_STATE_PREDICATION -Zustand befindet (der mit D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT identisch ist und einfach ein Alias ist).

Der Satz von Vorgängen, die prädiziert werden können, sind:

ExecuteBundle ist selbst nicht prädiziert. Stattdessen werden einzelne Vorgänge aus der obigen Liste, die auf der Seite des Bündels enthalten sind, prädiziert.

Die ID3D12GraphicsCommandList-Methoden ResolveQueryData, BeginQuery und EndQuery sind nicht prädiziert.

Indikatoren und Abfragen

Leistungsmessung

Exemplarische Vorgehensweise für Prädication-Abfragen