Freigeben über


Prädikation

Bei der Prädierung handelt es sich um ein Feature, mit dem die GPU anstelle der CPU bestimmen kann, ob ein Objekt nicht gezeichnet, kopiert oder verteilt werden soll.

Übersicht

Die typische Verwendung von Prädikationen ist mit Okklusion; wenn ein umgebendes Feld gezeichnet und verdeckt wird, gibt es offensichtlich keinen Punkt beim Zeichnen des Objekts selbst. In diesem Fall kann die Zeichnung des Objekts "prädiziert" werden, wodurch das Entfernen des tatsächlichen Renderings durch die GPU ermöglicht wird.

Zunächst mag dies redundant erscheinen über und über dem Standardtiefetest sowie einem frühen Tiefendurchlauf. Die Prädierung kann jedoch den Aufwand des Draw-Befehlszustands selbst sowie die Rasterung entfernen. Während ein frühzeitiger Tiefendurchlauf unnötige Pixel entfernt, kann er weiterhin Vertex-, Hull-, Domänen- und Geometrie-Shader ausführen und den Eingabeassembler mit fester Funktion, Tesselator und Rasterizer aufrufen. Durch Zeichnen eines einfachen Begrenzungsfelds oder eines ähnlichen Begrenzungsvolumens , das einfacher zu verarbeiten und zu rastern als das reale Modell ist, vermeiden Sie unnötige Rasterung und Verarbeitung.

Im Gegensatz zu Direct3D 11 wird die Prädierung von Abfragen entkoppelt und in Direct3D 12 erweitert, damit eine Anwendung Objekte basierend auf irgendeinem Grund prädiziert, den der App-Entwickler festlegen kann (nicht nur okklusion).

SetPredication

Die Prädierung 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 Vorabzustand aus.

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

Hinweise zur Voraberkennung sind in der Direct3D 12-API nicht vorhanden; und Die Prädierung ist für direkte Listen, Berechnungen und Kopieren von Befehlen zulässig. Der Quellpuffer kann sich in einem beliebigen Heap-Typ befinden (Standard, Upload, Leseback, benutzerdefiniert).

Die Kernlaufzeit überprüft Folgendes:

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

Die Debugebene gibt einen Fehler aus, wenn sich der Quellpuffer nicht im D3D12_RESOURCE_STATE_PREDICATION befindet (das identisch mit D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT und einfach einem Aliasstatus ist).

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

ExecuteBundle wird nicht selbst prädiziert. Stattdessen werden einzelne Vorgänge aus der Oben aufgeführten Liste, die in der Seite des Bündels enthalten sind, prädiziert.

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

Leistungsindikatoren und Abfragen

Leistungsmessung

Exemplarische Vorgehensweise für Vorababfragen