Werden Draw Calls parallel oder sequentiell oder beides ausgeführt?

8

Dies ist ein Follow-up für eine Frage, die ich auf GameDev SE beantwortet habe. Die Frage war einfach: Ist glDrawArraysInstanced in OpenGL beim Zeichnen dieser Instanzen parallel?

Meine Antwort lautete: "Die GPU kann abhängig von mehreren Dingen mehrere Draw-Aufrufe parallel ausführen, beispielsweise wenn zwei Draw-Aufrufe dieselben Vertex-Shader verwenden." Hier ist die vollständige Antwort .

In den Kommentaren erwähnte das OP: "Ich denke, es sollte sequentiell sein. Schließlich hängt ein Teil des Mischmodus von der Sequenz ab."

Jetzt bin ich ein bisschen verwirrt. Wird meine Antwort darauf sie immer noch parallelisieren, wenn sie gültig ist? Kann jemand das klären?

concept3d
quelle

Antworten:

9

Das Ergebnis sollte so aussehen, als ob es nacheinander dreieckig ausgeführt wurde. Dies ist wichtig, damit jeder Frame deterministisch ist. Wenn dies nicht der Fall wäre, könnte das mehrfache Zeichnen desselben Rahmens zu unterschiedlichen Ergebnissen und einem flackernden Bild auf dem Bildschirm führen.

Dies bedeutet jedoch nicht, dass eine Parallelisierung unmöglich ist . Scheitelpunkte können parallel berechnet werden. Ihre Ergebnisse werden geordnet und dem Rasterizer zugeführt, der die Fragment-Shader-Stufe speist.

Das gleiche passiert mit Pixeln. Typischerweise kann eine Gruppe von Pixeln aus einem Dreieck parallel berechnet und gemischt werden. Ein nicht überlappendes Dreieck kann dann auch gleichzeitig gefüllt werden. Wenn sich das Dreieck jedoch mit einem aktuell belegten Dreieck überlappt, muss das Ergebnis des Fragment-Shaders gepuffert werden, bis die entsprechenden Pixel des vorherigen Dreiecks fertig sind, damit das Mischen in der richtigen Reihenfolge erfolgen kann.

Ratschenfreak
quelle
Es ist durchaus möglich, den Pixel-Shader für überlappende Dreiecke gleichzeitig auszuführen. Alles was zählt ist, dass das Mischen nacheinander erfolgt. Pixel-Shader können in beliebiger Reihenfolge eine Menge Arbeit für die Mischeinheit ausführen, wodurch alle diese Mischvorgänge abhängig vom Dreieck, aus dem sie stammen, neu angeordnet werden können.
John Calsbeek
Ich habe Situationen gesehen, in denen Flackern aufgrund mehrerer Dreiecke in derselben Ebene auftritt, aber ich erinnere mich nicht, ob dies passiert ist, während die Kamera / Welt / etc. Transformationen waren statisch oder wenn es Bewegung und Neuberechnung erforderte. Das ist jedoch ein Randfall.
JAB
@JAB Es hört sich so an, als würden Sie sich auf Z-Fighting beziehen . Dies tritt normalerweise aufgrund der Tatsache auf, dass selbst wenn zwei Grundelemente analytisch koplanar sind, die Quantisierung im Interpolator ein Muster erzeugt, bei dem einige Pixel von beiden Grundelementen sichtbar sind. Das Muster verschiebt sich nur dann, wenn die Scheitelpunkte (oder die Kamera) bewegt werden. Andernfalls sollte das Interferenzmuster zwischen den Bildern konsistent sein.
MooseBoys
@ MooseBoys Genau das ist es, ja. Es ist ein paar Jahre her, seit ich viel mit 3D-Grafiken gemacht habe.
JAB
Abgesehen davon, dass nur mehrere Scheitelpunkte und Pixel parallel ausgeführt werden, können auch mehrere Zeichnungsaufrufe gleichzeitig ausgeführt werden, wenn genügend GPU-Ressourcen verfügbar sind und keine Abhängigkeit zwischen den Zeichnungsaufrufen besteht.
Nathan Reed